У меня есть проект Qt, использующий opencv и C++. Это программа обнаружения контуров, которая обнаруживает контуры нарисованных от руки каракулей, приближает их к многоугольнику и отображает результат на второй этикетке. Есть родительские и дочерние контуры. Если у контура нет дочерних элементов, то это родительский контур без отверстий. Если у родителя есть дочерние контуры, это означает, что он содержит дыры.
Моя проблема в том, что если контур открыт (то есть у родителя нет дочерних элементов), выходные данные имеют фрагментированный посмотрите, как будто некоторые моменты не правильно распознаны. Я проверяю, что аргументы «isClosed» и т. д. установлены правильно в зависимости от того, закрыт контур или нет. Но проблема остается.
Как видите, слева находится ввод, представляющий собой черную нарисованную от руки каракулю. Когда мышь отпущена, контуры рисунка (еще не приближенные к многоугольнику) отображаются вокруг фигур в виде синих контуров (выходные данные по желанию). В правой части показаны аппроксимированные многоугольники нарисованных фигур (тоже выходные данные). Как видите, замкнутый контур, похожий на цифру «8», отображается именно так, как хотелось бы, а вот остальные три «открытых» контура показаны в виде обрезанных линий, фрагментированы.
Основываясь на том, что я исследовал до сих пор, все, что я получил в качестве ответа, это либо манипулировать значением эпсилона, превращая его в нечто большее ИЛИ меньше, либо изменить пороговое значение. Мне ничего не помогло.
Вот мой класс opencv, который определяет контур (ScribbleWidget):
У меня есть проект Qt, использующий opencv и C++. Это программа обнаружения контуров, которая обнаруживает контуры нарисованных от руки каракулей, приближает их к многоугольнику и отображает результат на второй этикетке. Есть родительские и дочерние контуры. Если у контура нет дочерних элементов, то это родительский контур без отверстий. Если у родителя есть дочерние контуры, это означает, что он содержит дыры. Моя проблема в том, что если контур открыт (то есть у родителя нет дочерних элементов), выходные данные имеют фрагментированный посмотрите, как будто некоторые моменты не правильно распознаны. Я проверяю, что аргументы «isClosed» и т. д. установлены правильно в зависимости от того, закрыт контур или нет. Но проблема остается. [img]https://i.sstatic.net/bseBFYUr.png[/img]
Как видите, слева находится ввод, представляющий собой черную нарисованную от руки каракулю. Когда мышь отпущена, контуры рисунка (еще не приближенные к многоугольнику) отображаются вокруг фигур в виде синих контуров (выходные данные по желанию). В правой части показаны аппроксимированные многоугольники нарисованных фигур (тоже выходные данные). Как видите, замкнутый контур, похожий на цифру «8», отображается именно так, как хотелось бы, а вот остальные три «открытых» контура показаны в виде обрезанных линий, фрагментированы. Основываясь на том, что я исследовал до сих пор, все, что я получил в качестве ответа, это либо манипулировать значением эпсилона, превращая его в нечто большее ИЛИ меньше, либо изменить пороговое значение. Мне ничего не помогло. Вот мой класс opencv, который определяет контур (ScribbleWidget): [code]// priv class ScribbleWidgetPriv { friend ScribbleWidget;
// Create an empty canvas for contours (ensure the result canvas is blank) contourImage = cv::Mat::zeros(inputImage.size(), CV_8UC3); // Blank canvas for contours
for ( size_t i = 0; i < contours.size(); ++i ) { // Convert the current contour to a QPainterPath const auto& contour = contours[i]; QPainterPath path;
if ( !contour.empty() ) { path.moveTo(contour[0].x, contour[0].y);
// Use hierarchy to classify as parent or child if ( hierarchy[i][3] == -1 ) { // No parent, so it's a top-level (parent) contour parentPaths.append(path); } else { // Has a parent, so it's a nested (child) contour childPaths.append(path); } }
for (size_t i = 0; i < hierarchy.size(); ++i) { const cv::Vec4i& h = hierarchy[i]; int parentIdx = h[3]; // The index of the parent contour std::vector approxPolygon; bool hasChildren = (h[2] != -1); // Check if the contour has children bool isClosed = hasChildren; // Treat contours with children as closed
// Adjust epsilon for open vs closed contours double epsilon = isClosed ? 0.002 * cv::arcLength(contours[i], true) : 0.001 * cv::arcLength(contours[i], false);
// Approximate polygon based on open or closed status if (isClosed) { cv::approxPolyDP(contours[i], approxPolygon, epsilon, true); } else {
// Approximate the smoothed open contour cv::approxPolyDP(contours[i], approxPolygon, epsilon, false); }
У меня есть проект Qt, использующий opencv и C++. Это программа обнаружения контуров, которая обнаруживает контуры нарисованных от руки каракулей, приближает их к многоугольнику и отображает результат на второй этикетке. Есть родительские и дочерние...
У меня есть проект Qt, использующий opencv и C++. Это программа обнаружения контуров, которая обнаруживает контуры нарисованных от руки каракулей, приближает их к многоугольнику и отображает результат на второй этикетке. Есть родительские и дочерние...
У меня есть проект Qt, использующий opencv и C++. Это программа обнаружения контуров, которая обнаруживает контуры нарисованных от руки каракулей, приближает их к многоугольнику и отображает результат на второй этикетке. Есть родительские и дочерние...
У меня есть проект Qt, использующий opencv и C++. Это программа обнаружения контуров, которая обнаруживает контуры нарисованных от руки каракулей, приближает их к многоугольнику и отображает результат на второй этикетке. Есть родительские и дочерние...
PerformanceWarning: DataFrame сильно фрагментирован. Обычно это
результат многократного вызова Frame.insert, что приводит к низкой
производительности. Вместо этого рассмотрите возможность использования pd.concat....