Я извлек контур из изображения и хочу конкретно работать с пикселями в контуре. Мне нужно найти сумму (не площадь) значений пикселей в контуре. OpenCV поддерживает только ROI прямоугольной формы, поэтому я понятия не имею, как это сделать. cvSum также принимает только полные изображения и не имеет опции маски, поэтому я немного теряюсь в том, как действовать. Есть ли у кого-нибудь предложения о том, как найти сумму значений пикселей в конкретном контуре?
Работа с пикселями в контурах (OpenCV)?
Ответ 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 );
}
}