如何用opencv识别图片的颜色来判断是不同的图片?

nbhx2010 2011-01-03 04:49:00
图片比较有规则
形如 http://www.0574bbs.com/read-htm-tid-1054287.html里的两个小图
一个红色,一个深绿色

IplImage* pImg_test = cvLoadImage("red7.jpg",1);;
int r, g, b;
int intRedCount = 0;
int intS = 0;
for(int x = 0; x < pImg_test->width; x++)
{
for(int y = 0; y < pImg_test->height; y++)
{
r = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 2);
g = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 1);
b = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3);

//rgb=249 126 144的像素点是属于红色范围内的
if ((r >= 210) && (130 > g ) && (g > 110) && (150 > b ) && (b > 130))
{
intRedCount++;
}
}
}

if (intRedCount >= 10)
{
AfxMessageBox("r==255,现在是红色信号灯\n");
}


但是我用上面的方法,导入绿色图片后,rgb值跟红色图片的基本都类似,这是什么原因?
是不是下面提取rgb值的方法不对??

r = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 2);
g = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 1);
b = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3);


图像处理新手。。。。。。。。有经验的给点指点
...全文
1852 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nsc448720604 2011-03-15
  • 打赏
  • 举报
回复
iTempB = ((uchar *)(imgSrc->imageData + i*imgSrc->widthStep))[j*imgSrc->nChannels + 0];能解释下这里每个参数的意思么,或给出个讲解的地址
nbhx2010 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fengbingchun 的回复:]

for (i=0; i<iHeight; i++)
{
for (j=0; j<iWidth; j++)
{
iTempB = ((uchar *)(imgSrc->imageData + i*imgSrc->widthStep))[j*imgSrc->nChannels + 0];
iTempG = ((uchar *)(imgSrc->imageData + i*imgSrc->w……
[/Quote]

汗,这个方式可行。谢谢兄弟了,累死我了,我自己写的那个按理也没错啊,就是一直有问题
fengbingchun 2011-01-05
  • 打赏
  • 举报
回复
for (i=0; i<iHeight; i++)
{
for (j=0; j<iWidth; j++)
{
iTempB = ((uchar *)(imgSrc->imageData + i*imgSrc->widthStep))[j*imgSrc->nChannels + 0];
iTempG = ((uchar *)(imgSrc->imageData + i*imgSrc->widthStep))[j*imgSrc->nChannels + 1];
iTempR = ((uchar *)(imgSrc->imageData + i*imgSrc->widthStep))[j*imgSrc->nChannels + 2];

}
}
用这个试试看,一般不用CV_IMAGE_ELEM,也许是你的rgb位置搞错了
martenyong 2011-01-05
  • 打赏
  • 举报
回复
可以用cvGet2D试试看。
nbhx2010 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sd6814466 的回复:]

不过楼主引用的图片那是相当的好辨认啊。。。
想当初我用的图片那是放大了肉眼都分不出来颜色的。。。(红黄)
无数的灵感闪现、实行、淹没。。。
历历在目。。。
[/Quote]

那您给看看我那程序为啥不行?
我看opencv书上识别颜色就用到了 r = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 2)
并且我那两图片并没有太多的交集,为啥用上面的语句出来的rgb值差不多呢??
大蓝头 2011-01-04
  • 打赏
  • 举报
回复
对于这个,记得OPENCV有个什么正样本负样本的训练的,对于你这种简单的识别,应该1000张样本就够了。
如果你确定图都是这类似的话,估计可以先灰度化,阈值选取恰当的话,二值化后的图更加容易区分
sd666850 2011-01-04
  • 打赏
  • 举报
回复
这个有点难度,期待高手的解答
sd6814466 2011-01-04
  • 打赏
  • 举报
回复
不过楼主引用的图片那是相当的好辨认啊。。。
想当初我用的图片那是放大了肉眼都分不出来颜色的。。。(红黄)
无数的灵感闪现、实行、淹没。。。
历历在目。。。
sd6814466 2011-01-04
  • 打赏
  • 举报
回复
想起了我做的第一个项目。。。
让我纠结其中三个月啊。。。
很明显,楼主没好好思考rgb颜色空间,而单纯地以一个正方体范围来判别颜色
这会导致判别的误差,如果范围小还可以容忍,范围大了误差就。。。
提醒楼主一个比较好的方式吧,转成HSV颜色空间,好像是这个缩写吧,判断颜色会更直观
当然,区别非纯色图片还有很多路要走,如果是自己去找判别方式的话,也许会是一条痛苦而难以看到终点的路
曾经痛苦过,深深痛苦过。。。
martenyong 2011-01-04
  • 打赏
  • 举报
回复
看了一下你的图,感觉并不是所有的地方都能体现出绿色和红色的特点的,
红色那张中间那一块比较红,绿色的右下角比较绿。其他的地方都挺黑的,
可以只提取颜色差距比较明显的地方作比较啊
martenyong 2011-01-04
  • 打赏
  • 举报
回复
你有photoshop么?
用它打开两张图片,然后用取色器在你需要的范围内多点几次,看一看颜色取的是不是适当。
另外你的指示灯的像素有多少呢,超过10个就判断颜色是不是少了点啊。
nbhx2010 2011-01-04
  • 打赏
  • 举报
回复
顶了,这玩意看来有难度?

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧