① 如何使用Opencv对图像进行颜色特征提取
颜色可以直接提取RGB的兆洞分量,也可以转换成其他颜色空间再进行提则猜迹取;纹理有很多方法,孙并其中一种可以用gabor函数~
② 如何使用Opencv对图像进行颜色特征提取
打开小画家,将色卡打开,点击吸管工具,移动鼠标到红色块上方,松开鼠标,此时,吸管工具已经提取了红色色块信息。然后点击右方的“编辑颜色”,弹出颜色选择对话框,此时,右下角有刚才习惯的红绿蓝颜色信息,如红152,绿18,蓝15。这个就是颜色对应的RGB色彩值。
创建VC控制台工程,加入所需头文件和库文件。注意要事先将opencv 头文件和库文件添加到工程属性中,作者使用opencv2.4+VC2010示范。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <math.h>
#pragma comment (lib,"opencv_core244d.lib")
#pragma comment (lib,"opencv_highgui244d.lib")
#pragma comment (lib,"opencv_imgproc244d.lib")
定义一个颜色常量target,默认值即为刚才吸管工具提取的红色色块的RGB值分量,和一个计算与颜色标准值色差的函数,暂定为色差在10以内即为相近颜色。这里cv::Vec3b 变量对应一个数组值, Vec3b[0] 对应blue,Vec3b[1]对应green,Vec3b[2]对应Red,即BGR。
接着添加以下代码,目的为读取源图片,根据图片大小做一定的缩放,然后定义同样大小的一个灰度图,用于存贮计算结果值。核心算法如下,遍历源图片,色差(与红色色块比较)低于30的即为需要提取的颜色值,将此像素位置记录并写入到灰度图中,以黑色显示,否则设置为白色。然后将处理前后图片显示出来。
实际商业应用中也是可以如法炮制的,比如下图的药片,大小,颜色不统一,如何提取识别黄色小药片在何处或计算其数量呢。
笔者尝试使用吸管工具提取其BGR值为(22,184,245),将色差由10调整为30,可以正确检测此药片。如图。
③ opencv 中将图像中的某点颜色提取怎么写呢~~
((uchar *)(ipl_img->imageData + x * ipl_img->悉孙widthStep ))[(y+ ipl_img->width)* ipl_img->nChannels + 0] = ((src->imageData + ((int)j) * src->widthStep ))[((int)i) * src->nChannels + 0]; //改变该像素b的颜色分量
((uchar *)(ipl_img->imageData + x * ipl_img->widthStep ))[(y + ipl_img->width)* ipl_img->nChannels + 1] = ((src->imageData + ((int)j) * src->widthStep ))[((int)i)* src->nChannels + 1] ; //改变该像素g的颜色分量
((uchar *)(ipl_img->imageData + x * ipl_img->激弯widthStep ))[(y+ ipl_img->width) * ipl_img->nChannels + 2] = ((src->imageData + ((int)j) * src->widthStep ))[((int)i)* src->nChannels + 2]; //改变睁铅链该像素r的颜色分量
④ opencv摄像机捕捉魔方画面进行颜色识别的问题,如题。
首先魔方要买那种磨砂的减少反光的影响。其实也就是当光线太亮或者太暗色彩分量就变小了。
然后通过方法找到魔方的边界,然后将这个正方形部分截取出来处理。
后面就是一个面一个面的处理,将图片分成3*3共9个块,就是对应着9个色块。
下面就是对每个块的处理,去除其中的非色彩分量,就是这部分不参与后面的计算。
我曾经用过一销册个方法,就是通过颜色的值来区分,因为魔方有六种颜色。别的颜色基本没什么问题,只有红色与橙色有问题,由于魔方生产的时候,色彩并不是标准的。所以是不能用固定阈值来处理,也不能用图像的模版悉运来处理,因为那样模版要做的太多了。
个人觉得的办法是睁斗梁,整个魔方所有色块一起处理,先处理其他的颜色,最后再处理红色与橙色,可能会更精确些。就是越靠近红色分量的9个色块作为红色,越靠近橙色分量的9个色块作为橙色。
⑤ opencv对图像的颜色识别问题,要用python2实现
我没用过Python的Opencv的库,只是用过Python的Image的库;Image库已经可以结果这个问题了
我试着做一下:你先得安装PIL库
得到rgb三个通道,然后转到HSV通道,其中H表示0-255的颜色,V表示强度,你大概先知道紫色的范围是多少
fromPILimportImage
importcolorsys
defCalculateH(img):
iflen(img.getbands())==4:
ir,ig,ib,ia=img.split()
else:
ir,ig,ib=img.split()
Hdat=[]
Sdat=[]
Vdat=[]
forrd,gn,blinzip(ir.getdata(),ig.getdata(),ib.getdata()):
h,l,s=colorsys.rgb_to_hsv(rd/255.,gn/255.,bl/255.)
Hdat.append(h)
Sdat.append(l)
Vdat.append(s)
meanV=mean(Vdat)
returnHdat,meanV
defmyreadim(filename):
im=Image.open(filename)
H,V=CalculateH(im)
后面我就懒得写了,应该思路都清楚了吧,要转到其他的颜色通道上,不要在rgb通道上
⑥ opencv颜色识别代码
#include<iostream>
#include<cv.h>
#include"highgui.h"
#ifdef_DEBUG
#pragmacomment(lib,"opencv_core245d.lib")
#pragmacomment(lib,"opencv_highgui245d.lib")
#pragmacomment(lib,"opencv_imgproc245d.lib")
#else
#pragmacomment(lib,"opencv_core245.lib")
#pragmacomment(lib,"opencv_highgui245.lib")
#pragmacomment(lib,"opencv_imgproc245.lib")
#endif
intmain()
{
cv::VideoCapturecapture(0);
if(!capture.isOpened())
return0;
cv::Matimage,HSV,channels[3];
floatthreshold=0.3;
while(capture.read(image))
{
敬伍凯cv::cvtColor(image,HSV,CV_BGR2HSV);
橘改cv::split(HSV,channels);
cv::threshold(channels[0],channels[1],15,1,CV_THRESH_BINARY_INV);
cv::threshold(channels[0],channels[0],245,1,CV_THRESH_BINARY);
channels[0]+=channels[1];
亮唤cv::erode(channels[0],channels[0],cv::Mat::ones(3,3,CV_8UC1),cv::Point(1,1),3);
cv::Scalarv=cv::sum(channels[0]);
intresult=v[0]>channels[0].total()*threshold;
std::cout<<result<<std::endl;
}
}