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 点卡木 展开
[程序思路]//程序长了点,实在贴不下,就说一下思路吧:
(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 点卡木 展开
1个回答
展开全部
更多追问追答
追问
还想问一下哈:
(1)什么是“二值化”呢?具体用那个函数才能二值化呢?
(2)是把它变成Binary图像吗?
(3)saturation(饱和度)会对筛选颜色有影响吗?(例如只想筛选出红色,且考虑光线的干扰)如果把saturation考虑进去的话,要怎么做呢?
非常感谢!
追答
函数用cvThreshold,这个函数比较简单,不能处理中间灰度的二值化,但是用红色相减的办法是没有问题的。
你会用到的具体函数应该是:
cvLoadImage 读取图像
cvSplit 拆分通道
cvSub 通道图像相减
cvThreshold 二值化获取区域
cvFindContours 如果你需要红色区域的边缘点
如果在你原来方法上的话。
使用cvThreshold对S通道二值化,得到较高灰度的区域的二值图像。
然后这个用来做MASK用。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询