① 如何使用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;
}
}