基于opencv實現(xiàn)視頻中的顏色識別功能
顏色識別的原理
opencv中的顏色模型
RGB
RGB具有三個通道其,分別表示紅色通道®,綠色通道(G),藍(lán)色通道(B),3個通道在opencv中的取值均為0~255,它的顏色由3個通道的取值來共同決定,因此如果使用RGB圖像來進(jìn)行顏色的識別,會丟失很多的顏色。
HSV
HSV具有三個通道,其分別表示色調(diào)(H),飽和度(S),亮度(V),3個通道在opencv中的取值分別如下:
- H:0~180
- S:0~255
- V:0~255
其中H通道和S通道決定了顏色,V通道決定亮度
各種顏色對應(yīng)的三個通道的取值表如下:

因此通過限制HSV通道中相對應(yīng)的數(shù)值,就可以識別出對應(yīng)的顏色
顏色識別的實現(xiàn)(c++)
1.讀取攝像頭的實時畫面
VideoCapture capture(1);//0為電腦本身攝像頭,1位外置攝像頭
2.讀取攝像頭的當(dāng)前一幀的數(shù)據(jù)并轉(zhuǎn)換到HSV空間
capture >> frame; //讀取當(dāng)前幀 cvtColor(frame, imgHSV, COLOR_BGR2HSV);
3.對HSV圖像進(jìn)行直方圖均衡化
在此處使用直方圖均衡化是因為可以使用這種方法可以使原來比較少像素的灰度會被分配到別的灰度去,像素相對集中, 處理后灰度范圍變大,對比度變大,清晰度變大,所以能有效增強圖像。
split(imgHSV,temporary); equalizeHist(temporary[2], temporary[2]); merge(temporary, imgHSV); //將HSV圖像分割通道,并且做直方圖的均衡化
使用equalizeHist()函數(shù),其輸入必須是單通道的,因此使用split函數(shù)將得到的HSV圖像分割為三個通道之后,在進(jìn)行直方圖均衡化,然后再使用merge函數(shù)來合并三個通道。
此處僅對V通道進(jìn)行了直方圖均衡化,因為通過比對發(fā)現(xiàn)只對V通道進(jìn)行效果最好,具體的原因還不清楚。
4.將直方圖均衡化之后,使用inRange()函數(shù)來進(jìn)行圖像的識別
inRange(imgHSV, Scalar(H_W_L, S_W_L, V_W_L), Scalar(H_W_H, S_W_H, V_W_H), image);
其中H_W_L,H_W_L, S_W_L, V_W_L. . . 等數(shù)值分別為前面表格對應(yīng)的顏色值的最小值和最大值。
此函數(shù)是將在范圍內(nèi)的像素值為255,其與為0,反映到圖像上就是,選中的顏色為白色,其與的均為黑色。
操作到此顏色可以進(jìn)行識別,但是效果可能不會很好,因此可以再使用開操作來消除噪點,去掉小的干擾快,再使用閉操作來填充閉合區(qū)域。
5.開操作
kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//3*3的矩形卷積核,只要是奇數(shù)的都可以 morphologyEx(image,image,2,kernel);
6.閉操作
morphologyEx(image,image,3,kernel);
源代碼
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat frame,imgHSV,image,kernel;
vector<Mat>temporary;
int H_W_L = 0, H_W_H = 180;
int S_W_L = 0, S_W_H = 30;
int V_W_L = 221, V_W_H = 255;
VideoCapture capture(1);//讀取視攝像頭實時畫面數(shù)據(jù),0默認(rèn)是筆記本的攝像頭;如果是外接攝像頭,這里改為1
while (true)
{
capture >> frame; //讀取當(dāng)前幀
if (!frame.empty())
{ //判斷輸入的視頻幀是否為空的
cvtColor(frame, imgHSV, COLOR_BGR2HSV);
//threshold(gray, two_value, 125, 255, THRESH_BINARY);//二值圖像
split(imgHSV,temporary);
equalizeHist(temporary[2], temporary[2]);
/*equalizeHist(temporary[1], temporary[1]);
equalizeHist(temporary[0], temporary[0]);*/
merge(temporary, imgHSV); //將HSV圖像分割通道,并且做直方圖的均衡化
inRange(imgHSV, Scalar(H_W_L, S_W_L, V_W_L), Scalar(H_W_H, S_W_H, V_W_H), image);
kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(image,image,2,kernel);
morphologyEx(image,image,3,kernel);
imshow("直方圖", imgHSV);
imshow("原圖",frame);
imshow("window", image); //在window窗口顯示frame攝像頭數(shù)據(jù)畫面
}
if (waitKey(20) == 'q') //延時20ms,獲取用戶是否按鍵的情況,如果按下q,會推出程序
break;
}
capture.release(); //釋放攝像頭資源
destroyAllWindows(); //釋放全部窗口
return 0;
}
##結(jié)果

到此這篇關(guān)于基于opencv實現(xiàn)視頻中的顏色識別的文章就介紹到這了,更多相關(guān)OpenCV顏色識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++實現(xiàn)CStdioFile寫入及讀取文件并自動換行的方法
這篇文章主要介紹了VC++實現(xiàn)CStdioFile寫入及讀取文件并自動換行的方法,很實用的功能,需要的朋友可以參考下2014-08-08
Mac OS上搭建Apache+PHP+MySQL開發(fā)環(huán)境的詳細(xì)教程
這篇文章主要介紹了Mac OS上搭建Apache+PHP+MySQL開發(fā)環(huán)境的詳細(xì)教程,包括常見的PHP連接MySQL失敗問題的解決辦法,需要的朋友可以參考下2016-01-01

