2013-12-04 4 views
1

Если бы я мог обнаружить круг, используя детектор canny edge, как я могу получить доступ ко всем значениям, находящимся внутри круга?значения пикселя доступа внутри обнаруженного объекта/C++

void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false) 

выход этой функции даст мне краевые значения, которые детектируют с помощью детектора края, но то, что я хочу, это все значения внутри круга.

заранее спасибо

------ после редактирования .......

 Mat mask = Mat::zeros(canny_edge.rows, canny_edge.cols, CV_8UC1); 
    Mat crop(main.rows, main.cols, CV_32FC1); 
    main.copyTo(crop, mask); 

    for(unsigned int y=0; y< height; y++) 
      for(unsigned int x=0; x< width; x++) 
       if(mask.at<unsigned char>(y,x) > 0) 
       { 

       } 
+0

В отредактированной версии есть несколько проблем: 1. Я не уверен, что означает основной и подрез, но вы хотите обрезать (или подизображение) маску тоже, если это намерение. 2. 'mask' состоит только из нулей. Идея состояла в том, чтобы нарисовать объект (заполненный 255 значениями) на изображении маски. Поэтому везде, где маска не равна нулю, пиксель (маски) находится внутри объекта, а так как маска и исходное изображение имеют одинаковый размер, пиксель исходного изображения также находится внутри объекта. – Micka

ответ

2

Для круга, как и спросил оригинальный вопрос:

сначала хотите определить круг (например, используя методы обнаружения круга). Если вы это сделали, у вас есть какой-то центр круга и радиус. Посмотрите на http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

После этого вы должны проверить, находится ли пиксель внутри круга. Таким образом, одна идея (и с openCV довольно быстро) заключается в нарисовать заполненный круг на изображении маски и проверить для каждого пикселя в исходном изображении, установлен ли пиксель маски с одинаковыми координатами изображения (тогда пиксель находится внутри объект). Это работает для любого другого объекта, который можно вытащить, нарисуйте (заполнить) маску и значения тестовой маски.

Если у вас есть круг center и radius, и размер исходного изображения IMAGE_HEIGHT х image_width, попробуйте это:

cv::Mat mask = cv::Mat::zeros(image_height,image_width, CV_8U); 
cv::circle(mask, center, radius, cv::Scalar(255), -1); 
for(unsigned int y=0; y<image_height; ++y) 
    for(unsigned int x=0; x<image_width; ++x) 
    if(mask.at<unsigned char>(y,x) > 0) 
    { 
     //pixel (x,y) in original image is within that circle so do whatever you want. 
    } 

хотя это будет более эффективным, если ограничить область маски (круг центр +/- радиус в обоих измерениях) вместо обхода по всему изображению;)

+0

Большое спасибо за оба ответа. на самом деле, круг был просто примером. объект, который я пытаюсь обнаружить, не имеет формы круга или какой-либо конкретной формы. после применения какого-то реберного детектора, такого как canny, что мне делать, чтобы иметь доступ ко всем значениям пикселей внутри обнаруженного края? – user3049356

+0

Я принимаю ваш ответ (потому что я узнал об этом), но дайте мне знать, что мне делать в том случае, если объект не имеет какой-либо конкретной формы. – user3049356

+0

Я не уверен, что у вас есть только все ребра и не знаю, какие ребра строят конкретный объект, или если вы знаете, какой из ребер образует объект. В обоих случаях вы можете попытаться извлечь ** контур ** объекта с помощью некоторых opencv-методов (в первом случае вам придется сортировать нерелевантные контуры позже).Если это будет успешным (в основном, в зависимости от качества извлечения края), вы можете нарисовать этот контур, заполненный маской, и повторить его так же, как с кругом. Вам просто нужно заменить 'cv :: circle()' некоторым методом рисования контуров. Загруженное изображение примера будет приятным. – Micka

1

Для кругов вы должны использовать Hough Circle Transform. Из него вы получите центры и радиусы кругов на вашем изображении. Данный пиксель находится внутри определенного круга, если его расстояние от центра меньше радиуса круга.

Для общей формы используйте findCountours, чтобы получить контур фигуры, затем вы можете использовать pointPolygonTest, чтобы определить, что точки слияния находятся внутри этой формы. На нем есть tutorial.

+0

Большое спасибо за ответ. на самом деле, круг был просто примером. объект, который я пытаюсь обнаружить, не имеет формы круга или какой-либо конкретной формы. после применения какого-то реберного детектора, такого как canny, что мне делать, чтобы иметь доступ ко всем значениям пикселей внутри обнаруженного края? – user3049356

+0

Я добавил ответ на свой новый вопрос к моему ответу. – Bull

+0

спасибо. пожалуйста, проверьте мой адрес ... это хорошо работает? – user3049356

Смежные вопросы