Как определить самопересечение контура с C ++ и OpenCV?

Мне нужно проверить контур на самопересечении, но я не знаю, как это реализовать. Или как я могу обнаружить только контуры без самопересечения в cv :: Mat?

введите описание изображения здесь

F.ex. левый контур должен совпадать, правый контур не совпадать

2

Решение

Если линии представлены многоугольником (вы знаете угловые точки), вы можете нарисовать линии на матрице накопления.

Объявить новый бланк cv::Mat типа CV_8UC1 и инициализировать его с нулевыми значениями. Для каждого пикселя между двумя строками увеличьте матрицу на 1,

Я не при использовании cv::line Метод — лучший способ выполнить эту задачу (вы можете создать новое изображение для каждой строки и суммировать все изображения как последний шаг). Лучший способ, который я могу придумать, — это увеличить точки, используя уравнение линии.

Когда вы рисуете линии, которые пересекаются, в матрице накопления вы будете иметь значения 2, Если вы найдете их, вы будете знать, что контур имеет самопересечение, а также знаете, где они находятся.

Если у вас есть изображение в качестве входных данных, то вышеупомянутое решение может работать.

С наилучшими пожеланиями!

1

Другие решения

Вот решение:

  1. Скелет + обрезка => уменьшить контуры до ширины в один пиксель
  2. Для каждого пикселя вычислите количество соседей
  3. Если у пикселя более двух соседей, то он находится в середине пересечения.
  4. (необязательно) Маркировка подключенных компонентов для разделения различных форм.

Вы также можете использовать преобразование Хафа.

0

Я старался сделать это лучше всего, но не смог из-за отсутствия логики для его кодирования. Логика, которую я попробовал, у вас есть набор точек контуров. Теперь проверьте вхождение каждой точки, т. Е. Сколько раз каждая точка появлялась, если она появлялась более одного раза, она указывает точку пересечения.

Дайте мне знать, если я ошибаюсь.

код, который я пробовал, не работает для этой логики, может быть, кто-то может помочь вам с этим.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;
using namespace std;
RNG rng(12345);
int main( )
{Mat image;
image = imread("0.png", CV_LOAD_IMAGE_COLOR);   // Read the file

if(! image.data )                              // Check for invalid input
{
cout <<  "Could not open or find the image" << std::endl ;
return -1;
}

cvtColor(  image,  image, CV_BGR2GRAY );
namedWindow( "Display window12", WINDOW_AUTOSIZE );// Create a window for display.
imshow( "Display window12", image );
Mat drawing;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( image, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
int m = 1;
vector<Point> contours1;

for(int i= 0; i < contours.size(); i++)
{
for(int j= 0; j < contours[i].size();j++) // run until j < contours[i].size();
{

contours1.push_back(Point (contours[i][j]));

//   cout << contours[i][j] << "contours1"<<contours1<<endl; //do whatever
}
}
cout<<contours.size();
// Finding the occrence of each point it has appeared

//for(int i=0;i<contours.size();i++)
//{
//    for(int j=0; j<contours[i].size();j++) // run until j < contours[i].size();
//    {
//      //contours1.push_back(Point (contours[i][j]));
//      //if (contours[i][j] == contours[i][j])
//           if( contours[i] ==contours1.at(i).x)
//          //   if( posX ==points.at(p).x)
//          cout<<"hi";
//     //   cout << contours[i][j] << "contours1"<<contours1<<endl; //do whatever
//   }
//}

namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
imshow( "Display window", image );
waitKey(0);                                          // Wait for a keystroke in the window
return 0;
}
0
По вопросам рекламы [email protected]