首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenCV检测颜色的最有效方法是什么?

使用OpenCV检测颜色的最有效方法是什么?
EN

Stack Overflow用户
提问于 2012-02-22 03:23:57
回答 2查看 4.5K关注 0票数 2

我使用以下命令在图像中心附近设置了一个感兴趣的区域:

代码语言:javascript
复制
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是否出现在当前帧中,最有效的方法是什么?

解决方案:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-22 06:08:06

我假设你只是想知道red在ROI中的百分比。如果不正确,请澄清。

我会扫描感兴趣区域,并将每个像素转换为更好的颜色空间,以便进行颜色比较,例如YCbCr或HSV。然后我会计算色调在红色色调的某个增量(通常是色轮上的0度)内的像素数量。你可能需要处理一些边缘情况,在这些情况下,亮度或饱和度太低,人类无法认为它们是红色的,尽管从技术上讲它们是红色的,这取决于你试图实现的目标。

票数 3
EN

Stack Overflow用户

发布于 2012-02-23 19:51:19

这个解决方案不仅要解决红色问题,还要解决任何颜色分布问题

获取感兴趣区域的颜色直方图,二维色调和饱和度直方图(遵循示例here).

  • Use calcBackProject to project the histogram back in the full image )。您将获得在直方图模式附近呈现颜色的像素的较大值(在本例中,对结果进行reds).

  • Threshold以获得与分布更匹配的像素(在本例中为“最佳红色”)。

例如,该解决方案可用于获得简单但功能非常强大的皮肤检测器。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9383802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档