Подтвердить что ты не робот

Работа с пикселями в контурах (OpenCV)?

Я извлек контур из изображения и хочу конкретно работать с пикселями в контуре. Мне нужно найти сумму (не площадь) значений пикселей в контуре. OpenCV поддерживает только ROI прямоугольной формы, поэтому я понятия не имею, как это сделать. cvSum также принимает только полные изображения и не имеет опции маски, поэтому я немного теряюсь в том, как действовать. Есть ли у кого-нибудь предложения о том, как найти сумму значений пикселей в конкретном контуре?

4b9b3361

Ответ 1

Сначала получите все ваши контуры. Используйте эту информацию, чтобы создать двоичное изображение, а белые части - контурный контур и область. Выполните операцию И на двух изображениях. Результатом будут контуры и область на черном фоне. Затем просто суммируйте все пиксели этого изображения.

Ответ 2

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

CvRect cvBoundingRect(CvArr* points, int update=0 );

После этого вы можете сделать промежуточное изображение с помощью

void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL);

используя значение 0, маску, полученную из контура и устанавливающую ранее как ROI ограничивающий прямоугольник.

После этого сумма на полученном изображении будет немного быстрее.

Ответ 3

Для доступа к контурной точке выполните индивидуальный код

vector<vector<Point> > contours;
...
printf("\n Contours pixels \n");
for(int a=0; a< contours.size(); a++)
{  
   printf("\nThe contour NO = %d  size = %d \n",a, contours[a].size() );
   for( int b = 0; b < contours[a].size();  b++ )  
   {  
       printf(" [%d, %d] ",contours[a][b].x, contours[a][b].y ); 
   }
}