基于Opencv實現(xiàn)顏色識別
彩色模型
數(shù)字圖像處理中常用的采用模型是RGB(紅,綠,藍)模型和HSV(色調(diào),飽和度,亮度),RGB廣泛應用于彩色監(jiān)視器和彩色視頻攝像機,我們平時的圖片一般都是RGB模型。而HSV模型更符合人描述和解釋顏色的方式,HSV的彩色描述對人來說是自然且非常直觀的。
HSV模型
HSV模型中顏色的參數(shù)分別是:色調(diào)(H:hue),飽和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年創(chuàng)建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。
(1)色調(diào)(H:hue):用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°;
(2)飽和度(S:saturation):取值范圍為0.0~1.0,值越大,顏色越飽和。
(3)亮度(V:value):取值范圍為0(黑色)~255(白色)
RGB轉成HSV
設 (r, g, b) 分別是一個顏色的紅、綠和藍坐標,它們的值是在 0 到 1 之間的實數(shù)。設 max 等價于 r, g 和 b 中的最大者。設 min 等于這些值中的最小者。要找到在 HSV 空間中的 (h, s, v) 值,這里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是飽和度和亮度,方法如下:
max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min)
H = H * 60
if H < 0, H = H + 360
- V=max(R,G,B)
- S=(max-min)/max
OpenCV下有個函數(shù)可以直接將RGB模型轉換為HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我們知道H分量基本能表示一個物體的顏色,但是S和V的取值也要在一定范圍內(nèi),因為S代表的是H所表示的那個顏色和白色的混合程度,也就說S越小,顏色越發(fā)白,也就是越淺;V代表的是H所表示的那個顏色和黑色的混合程度,也就說V越小,顏色越發(fā)黑。經(jīng)過實驗,識別藍色的取值是 H在100到140,S和V都在90到255之間。一些基本的顏色H的取值可以如下設置:
Orange 0-22,Yellow 22- 38,Green 38-75,Blue 75-130,Violet 130-160,Red 160-179
具體實現(xiàn)
(1) 讀取一張圖片
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);
(2)將彩色圖像均衡化
split(imgHSV, hsvSplit); equalizeHist(hsvSplit[2],hsvSplit[2]); merge(hsvSplit,imgHSV);
(3)檢測顏色
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);
(4)進行開操作和閉操作,去除噪聲的影響。
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element); morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
代碼:
#include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<iostream> using namespace cv; using namespace std; //入口主函數(shù) int main(int argc, char** argv) { //打開攝像頭,從攝像頭獲取圖像 VideoCapture cap(0); if (!cap.isOpened()) { cout << "Cannot open the web cam"<<endl; return -1; } //創(chuàng)建窗口 namedWindow("Control",CV_WINDOW_AUTOSIZE); int iLowH = 100; int iHighH = 140; int iLowS = 90; int iHighS = 255; int iLowV = 90; int iHighV = 255; //創(chuàng)建進度條 cvCreateTrackbar("LowH","Control",&iLowH,179); cvCreateTrackbar("HighH", "Control", &iHighH,179); cvCreateTrackbar("LowS", "Control", &iLowS,255); cvCreateTrackbar("Highs", "Control", &iHighS,255); cvCreateTrackbar("LowV", "Control", &iLowV,255); cvCreateTrackbar("HighV", "Control", &iHighV,255); //while循環(huán)加載圖片 while (true) { Mat imgOriginal; bool bSuccess = cap.read(imgOriginal); if (!bSuccess) { cout << "Cannot read a frame from video stream" << endl; break; } // Mat imgHSV; vector<Mat> hsvSplit; cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV); //轉化成直方圖均衡化 split(imgHSV,hsvSplit); equalizeHist(hsvSplit[2],hsvSplit[2]); merge(hsvSplit,imgHSV); Mat imgThresholded; //確定顏色顯示的范圍 inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded); //去除噪點 Mat element = getStructuringElement(MORPH_RECT,Size(5,5)); morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element); //連接連通域 morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element); imshow("Thresholded Image",imgThresholded); imshow("Original",imgOriginal); //等待時間 char Key = (char)waitKey(300); if (Key==27) { break; } } return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10數(shù)據(jù)結構課程設計-用棧實現(xiàn)表達式求值的方法詳解
- 01-10使用OpenGL實現(xiàn)3D立體顯示的程序代碼
- 01-10求斐波那契(Fibonacci)數(shù)列通項的七種實現(xiàn)方法
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運算符做加法
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10深入全排列算法及其實現(xiàn)方法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10用C語言實現(xiàn)單鏈表的各種操作(一)
- 01-10用C語言實現(xiàn)單鏈表的各種操作(二)


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載