Opencv:怎么找到一个红颜色区域呢?

[情况]程序总是找不到红色区域[程序思路]//程序长了点,实在贴不下,就说一下思路吧:(1)加载一个RGB图像(2)用cvCvtColor()将其转化为HSV图像(听说转... [情况]程序总是找不到红色区域
[程序思路]//程序长了点,实在贴不下,就说一下思路吧:
(1)加载一个RGB图像
(2)用cvCvtColor() 将其转化为HSV图像(听说转成HSV找具体颜色方便些)
(3)用cvCvtPixToPlane()将HSV图像分解成分别只有H,S,V的单通道图像
(4)只用其中的H通道
(5)用以下循环,找到红色区域
for(int y=0;y<h_img->height;y++)
{
int* ptr=(int*)(h_img->imageData+y*h_img->widthStep);
for(int x=0;x<h_img->width-1;x++)
{
h_former=ptr[x];
h_later=ptr[x+1];

if((!myIsRed(h_former)) && myIsRed(h_later))
{
//This point is the first red point
points[0]=x;
points[1]=y;
}else if(myIsRed(h_former && (!myIsRed(h_later)))){
//This point is the last red point
points[2]=x;
points[3]=y;
}else{
//This poing is the common point
}

}
}
(6)其中myIsRed(),是一个判断该点是否为红色的函数,如下:
bool myIsRed(int h)
{
if((h>=0 && h<=59) || (h>=300 && h<=360)){
return true;
}else{
return false;
}
}
//传说中:如果0<=h<=59 或 300<=h<=360即为红色,不知是真是假......
(7)整个大函数返回的是 :红色区域的第一个点和最后一个点的坐标存在一个叫
int points[4] 这样一个数组中。然后用这两个坐标在图片上画一个矩形。
[!!!!!]但程序怎么都找不对红颜色的区域,而且偏差很大。
------------------------------------------------------------------
希望各位大鸟说的详细些,非常感谢!
[邮!箱] lzninchina (at) sina 点卡木
展开
 我来答
88447821
推荐于2017-11-25 · TA获得超过1504个赞
知道小有建树答主
回答量:729
采纳率:100%
帮助的人:300万
展开全部
1.既然知道了灰度值范围,为什么不直接用二值化?
2.选取色彩的时候应该要考虑S,要去除低Saturation的颜色。你这里没做,是不是有这个原因。
HALCON例程里提供了一个简单的办法提取红色。
可以直接用RGB转成3个灰度图。用红色通道的灰度图分别减去另两个通道的和,
然后二值化提取你要的灰度值(一般是正数),就可以提取红色了。
更多追问追答
追问
还想问一下哈:
(1)什么是“二值化”呢?具体用那个函数才能二值化呢?
(2)是把它变成Binary图像吗?
(3)saturation(饱和度)会对筛选颜色有影响吗?(例如只想筛选出红色,且考虑光线的干扰)如果把saturation考虑进去的话,要怎么做呢?
非常感谢!
追答
函数用cvThreshold,这个函数比较简单,不能处理中间灰度的二值化,但是用红色相减的办法是没有问题的。
你会用到的具体函数应该是:
cvLoadImage 读取图像
cvSplit 拆分通道
cvSub 通道图像相减
cvThreshold 二值化获取区域
cvFindContours 如果你需要红色区域的边缘点

如果在你原来方法上的话。
使用cvThreshold对S通道二值化,得到较高灰度的区域的二值图像。
然后这个用来做MASK用。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式