用opencv怎么识别摄像头捕获视屏流中的特定颜色块

转载 2016年05月31日 10:27:53



用opencv怎么识别摄像头捕获视屏流中的特定颜色块

举报描述不清违规检举侵权投诉| 2011-09-11 11:44 zq44zq | 浏览 2821 次
我想实现以下功能,用摄像头拍摄视频,然后电脑实时处理视频流,并识别每一帧中的特定颜色快,比如蓝色(就是蓝色成分较多)的部分。识别完后,符合条件的部分不变,不符合的部分涂黑。我知道用opencv可以捕获摄像头视频流,并处理某一帧。以下是我用c++编的代码的一部分,
void callback(IplImage * image)
{
	for(int i=0;i<image->height;i+=1)
	{
		for(int j=(image->widthStep)*i;j<(image->widthStep)*(i+1);j+=image->nChannels)
		{
			if(image->imageData[j]>BYTE(150))
			{
			}
			else
			{
				image->imageData[j]=BYTE(0);
				image->imageData[j+1]=BYTE(0);
				image->imageData[j+2]=BYTE(0);
			}
		}
	}
}
本来是想实现,视频流中蓝色成较多的部分保留,其余部分涂黑,但结果是,较亮的地方保留,较暗的地方涂黑,这是怎么回事呀,好急呀,望各位高手赐教。

可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  • opencv
  • 摄像头
  • 颜色

我有更好的答案


你首先将颜色空间转换到HSI空间去,然后根据HSI颜色空间的性质,找到对应的蓝色目标对应的H值和S值,提取出符合条件的像素,然后再转换到RGB空间。其实你也可以直接在RGB颜色空间,首先找到蓝色对应的RGB区间(B>R,B>G,蓝色目标满足的条件),另外RGB空间,B值满足的条件,提取出满足蓝色分量的目标,我以前做了一个,是提取蓝色目标的,效果还可以。
追问:
其实我也想直接在rgb空间提取蓝色成分较多的部分,我上述提供的代码就体现了这个想法,但是奇怪的是本来是想实现,视频流中蓝色成较多的部分保留,其余部分涂黑,但结果是,较亮的地方保留,较暗的地方涂黑。这是怎么回事呀,难道是摄像头的问题,是不是要摄像头能提供rgb24流才行呀,但是想一下也不对,既然void callback(IplImage * image)函数中输出使用的时rgb24格式,那么输入也应该是rgb24吧,好迷惑,还请高手继续指教。
追答:
你要把R>240&&B>240&&G>240(或者你自己设置应该阈值),将接近白色的区域给过滤掉。
并且你设置条件的时候要注意,对于蓝色目标总是有B>R&&B>G。(BGR)
         CvScalar cs,rs;	
	cs=cvScalar(0,0,0,0);
	rs=cvScalar(1,1,1,1);
	for(int i=0;i<src->height;i++)
	{	
    	    for (int j=0;j<src->width;j++)
		{
			cs=cvGet2D(src,i,j);			
			if(cs.val[0]>cs.val[1]+Thresh1 && cs.val[0]>cs.val[2]+Thresh1   && cs.val[0]<240 && cs.val[1]<240 && cs.val[2]<240)
			{				
				continue;
			}
			else
			{
				cvSet2D(src,i,j,rs);
			}
		}
	}
追问:
但是我发现当我设置阀值时,比如R>200时,视屏输出是全黑,也就是没有符合条件的像素元,于是我逐渐降低阀值,当R>127时,才能看到一些图像,也就是对于输入视屏流某一帧的图像,其数组值得范围好像不大于127.这就怪了,按理说rgb24的取值应该是0~256.怎么会只到127呢。是不是我的代码格式有问题,能不能使用image->imageData[j]>BYTE(150)这种比较格式。或者是摄像头的问题。不解呀,好着急呀
追答:
你那种格式我不太清楚,你用我给你的那种形式应该是没问题的
追问:
这位大神可以留个qq吗,还是不太懂,src是不是IplImage类型的指针呀,还有你这个代码和摄像头输出格式有没有关系呀,是不是对所有usb无驱动式摄像头都适用呀。
提问者评价
真是多谢你了,src是IplImage类型的指针,我改了后果然有用,多谢多谢,真是帮了我一个大忙。
评论(2) | 给力5 不给力0

如何用Opencv 把视频提取的图像中特定区域的颜色读取出来?求范例程序

如何用Opencv 把视频提取的图像中特定区域的颜色读取出来?求范例程序 举报描述不清违规检举侵权投诉| 分享| 2012-11-04 10:31 幻心魔才 | 浏览 970 次 ...
  • autumn20080101
  • autumn20080101
  • 2016年05月31日 10:29
  • 456

opencv颜色识别和操作

#include "highgui.h" #include "cv.h" #include "cxcore.h" #include "cvaux.h" #include ...
  • wzdjsgf
  • wzdjsgf
  • 2016年03月10日 21:12
  • 1199

OpenCV捕获视频和摄像头

从文件中捕获视频 其实使用OpenCV读取视频相当简单,只需要初始化一个VideoCapture对象,打开视频文件,逐帧读取。 程序 下面是简单的OpenCV代码: 1 2 3 4 ...
  • qq_26898461
  • qq_26898461
  • 2015年10月12日 11:02
  • 1617

七.使用OpenCv进行图像颜色识别

接着上一篇的图像灰度处理后,接下来对灰度图像进行颜色识别,本人的方法比较简单,有其他好方法的可以提出来,大家共同进步。 目的: 将所有一副灰度图像中像素点灰度大于128的变为白色(设置为255),小于...
  • scottly1
  • scottly1
  • 2014年04月06日 21:54
  • 6569

Opencv颜色识别

彩色模型 数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人...
  • clp786080772
  • clp786080772
  • 2016年07月14日 21:40
  • 2277

opencv读取摄像头训练识别自己的头像

前提 感谢网络上相头的博客和资料,由于版本的原因有些api的更改使得源代码不能直接使用,所以这里放上自己基于opencv3.4做的测试。 流程 打开摄像头 保存自己的头像 整理自己头像模型...
  • liyangyang08
  • liyangyang08
  • 2018年01月07日 11:04
  • 177

opencv学习实例(一)---camshift 色块追踪(详细注释)

/* 程序描述:来自OpenCV安装目录下Samples文件夹中的官方示例程序-彩色目标跟踪操作 增加了"非常"详细的注释。----97年的顽石----------------...
  • qq_35208390
  • qq_35208390
  • 2017年10月24日 14:15
  • 417

制作好看又非常简单CSS样式的颜色块

在这里我将我最近学到的CSS样式的渐变颜色块记录下来
  • qq_28499043
  • qq_28499043
  • 2015年08月25日 18:49
  • 2507

OpenCV摄像头视频数据采集与RTSP和RTMP直播

最近比较闲,因此研究
  • dogpig945
  • dogpig945
  • 2014年04月22日 22:59
  • 9231

opencv从摄像头读取视频并实时进行人脸检测代码

// 加载Haar特征检测分类器          // haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径          co...
  • NJU_ZJL
  • NJU_ZJL
  • 2015年05月14日 20:46
  • 2960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用opencv怎么识别摄像头捕获视屏流中的特定颜色块
举报原因:
原因补充:

(最多只允许输入30个字)