我使用以下命令在图像中心附近设置了一个感兴趣的区域:
Mat frame;
//frame has been initialized as a frame from a camera input
Rect roi= cvRect(frame.cols*.45, frame.rows*.45, 10, 8);
image_roi= frame(roi);
//I stoped here not knowing what to do next我使用的是相机,当我抓取一帧图像时,ROI会在30%到100%之间填充我想要的颜色,在本例中是红色。要知道Red是否出现在当前帧中,最有效的方法是什么?
解决方案:
image_roi= frame(roi);// a frame from my camera as a cv::Mat
cvtColor(image_roi, image_roi, CV_BGR2HSV);
thrs= new Mat(image_roi.rows, image_roi.cols, CV_8UC1);//allocate space for new img
inRange(image_roi, Scalar(0,100,100), Scalar(12,255,255), *thrs);//do hsv thresholding for red
for(int i= 0; i < thrs->rows; i++)//sum up
{
for(int j=0; j < thrs->cols; j++)
{
sum= sum+ thrs->data[(thrs->rows)* i + j];
}
}
if(sum> 100)//my application only cares about red
cout<<"Red"<<endl;
else
cout<<"White"<<endl;
sum=0;发布于 2012-02-22 06:08:06
我假设你只是想知道red在ROI中的百分比。如果不正确,请澄清。
我会扫描感兴趣区域,并将每个像素转换为更好的颜色空间,以便进行颜色比较,例如YCbCr或HSV。然后我会计算色调在红色色调的某个增量(通常是色轮上的0度)内的像素数量。你可能需要处理一些边缘情况,在这些情况下,亮度或饱和度太低,人类无法认为它们是红色的,尽管从技术上讲它们是红色的,这取决于你试图实现的目标。
发布于 2012-02-23 19:51:19
这个解决方案不仅要解决红色问题,还要解决任何颜色分布问题
获取感兴趣区域的颜色直方图,二维色调和饱和度直方图(遵循示例here).
calcBackProject to project the histogram back in the full image )。您将获得在直方图模式附近呈现颜色的像素的较大值(在本例中,对结果进行reds).
例如,该解决方案可用于获得简单但功能非常强大的皮肤检测器。
https://stackoverflow.com/questions/9383802
复制相似问题