我使用以下方式在我的图像中心附近设置了一个感兴趣的区域:
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%之间填充我想要的颜色,在这种情况下为红色。知道当前帧中是否存在红色的最有效方法是什么?
解决方案:
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;
答案 0 :(得分:4)
此解决方案不仅应解决红色问题,还应解决任何颜色分布:
calcBackProject
与project the histogram back in the full image。您将获得更大的值,其颜色在直方图的模式附近呈现颜色(在本例中为红色)。例如,可以使用此解决方案来获得一个简单但非常实用的皮肤检测器。
答案 1 :(得分:3)
我假设您只想知道投资回报率中红色的百分比。如果这不正确,请澄清。
我会扫描ROI并将每个像素转换为更好的色彩空间以进行颜色比较,例如YCbCr或HSV。然后我会计算色调在红色色调的某个增量范围内(通常在色轮上为0度)的像素数。您可能需要处理一些边缘情况,其中亮度或饱和度太低而人类认为它们是红色的,即使从技术上来说它们也是,取决于您想要实现的目标。