基于Opencv實(shí)現(xiàn)顏色識(shí)別
彩色模型
數(shù)字圖像處理中常用的采用模型是RGB(紅,綠,藍(lán))模型和HSV(色調(diào),飽和度,亮度),RGB廣泛應(yīng)用于彩色監(jiān)視器和彩色視頻攝像機(jī),我們平時(shí)的圖片一般都是RGB模型。而HSV模型更符合人描述和解釋顏色的方式,HSV的彩色描述對(duì)人來(lái)說(shuō)是自然且非常直觀的。
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°,從紅色開始按逆時(shí)針?lè)较蛴?jì)算,紅色為0°,綠色為120°,藍(lán)色為240°。它們的補(bǔ)色是:黃色為60°,青色為180°,品紅為300°;
(2)飽和度(S:saturation):取值范圍為0.0~1.0,值越大,顏色越飽和。
(3)亮度(V:value):取值范圍為0(黑色)~255(白色)
RGB轉(zhuǎn)成HSV
設(shè) (r, g, b) 分別是一個(gè)顏色的紅、綠和藍(lán)坐標(biāo),它們的值是在 0 到 1 之間的實(shí)數(shù)。設(shè) max 等價(jià)于 r, g 和 b 中的最大者。設(shè) 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下有個(gè)函數(shù)可以直接將RGB模型轉(zhuǎn)換為HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我們知道H分量基本能表示一個(gè)物體的顏色,但是S和V的取值也要在一定范圍內(nèi),因?yàn)镾代表的是H所表示的那個(gè)顏色和白色的混合程度,也就說(shuō)S越小,顏色越發(fā)白,也就是越淺;V代表的是H所表示的那個(gè)顏色和黑色的混合程度,也就說(shuō)V越小,顏色越發(fā)黑。經(jīng)過(guò)實(shí)驗(yàn),識(shí)別藍(lán)色的取值是 H在100到140,S和V都在90到255之間。一些基本的顏色H的取值可以如下設(shè)置:
Orange 0-22,Yellow 22- 38,Green 38-75,Blue 75-130,Violet 130-160,Red 160-179
具體實(shí)現(xiàn)
(1) 讀取一張圖片
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);
(2)將彩色圖像均衡化
split(imgHSV, hsvSplit); equalizeHist(hsvSplit[2],hsvSplit[2]); merge(hsvSplit,imgHSV);
(3)檢測(cè)顏色
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);
(4)進(jìn)行開操作和閉操作,去除噪聲的影響。
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)建進(jìn)度條
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);
//轉(zhuǎn)化成直方圖均衡化
split(imgHSV,hsvSplit);
equalizeHist(hsvSplit[2],hsvSplit[2]);
merge(hsvSplit,imgHSV);
Mat imgThresholded;
//確定顏色顯示的范圍
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded);
//去除噪點(diǎn)
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);
//等待時(shí)間
char Key = (char)waitKey(300);
if (Key==27)
{
break;
}
}
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- OpenCV HSV顏色識(shí)別及HSV基本顏色分量范圍
- opencv攝像頭捕獲識(shí)別顏色
- opencv如何識(shí)別圖片上帶顏色的圓
- python+opencv實(shí)現(xiàn)文字顏色識(shí)別與標(biāo)定功能
- Python+OpenCV實(shí)現(xiàn)基于顏色的目標(biāo)識(shí)別
- Python+OpenCV實(shí)現(xiàn)圖片及視頻中選定區(qū)域顏色識(shí)別
- 基于opencv實(shí)現(xiàn)視頻中的顏色識(shí)別功能
- Python?OpenCV實(shí)現(xiàn)簡(jiǎn)單的顏色識(shí)別功能(對(duì)紅色和藍(lán)色識(shí)別并輸出)
- Opencv識(shí)別圖片顏色并繪制輪廓實(shí)現(xiàn)代碼示例
相關(guān)文章
Qt5 串口類QSerialPort的實(shí)現(xiàn)
在Qt5以上提供了QtSerialPort模塊,方便編程人員快速的開發(fā)應(yīng)用串口的應(yīng)用程序。本文主要介紹了Qt5 串口類QSerialPort的實(shí)現(xiàn),,感興趣的可以了解一下2022-05-05
C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)
這篇文章主要介紹了C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷的相關(guān)資料,為了加快查找節(jié)點(diǎn)的前驅(qū)和后繼。對(duì)二叉樹的線索化就是對(duì)二叉樹進(jìn)行一次遍歷,在遍歷的過(guò)程中檢測(cè)節(jié)點(diǎn)的左右指針是否為空,如果是空,則將他們改為指向前驅(qū)和后繼節(jié)點(diǎn)的線索,需要的朋友可以參考下2017-08-08
基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器
這篇文章主要介紹了基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
C++使用FFmpeg實(shí)現(xiàn)YUV數(shù)據(jù)編碼轉(zhuǎn)視頻文件
這篇文章主要介紹了C++如何使用FFmpeg實(shí)現(xiàn)把一個(gè)YUV原始視頻數(shù)據(jù)(時(shí)間序列圖像)經(jīng)過(guò)h264編碼為視頻碼流,然后在使用mp4封裝格式封裝,感興趣的可以了解一下2023-06-06
C++中strcpy函數(shù)的實(shí)現(xiàn)
strncpy這個(gè)可以指定拷貝字符的長(zhǎng)度,指定源地址,目標(biāo)地址,還有需要拷貝的字符的長(zhǎng)度; strcpy只能傳入兩個(gè)參數(shù),只指定拷貝的起始地址跟目標(biāo)地址,然后整體拷貝;2015-10-10
C++基礎(chǔ)入門教程(一):基礎(chǔ)知識(shí)大雜燴
這篇文章主要介紹了C++基礎(chǔ)入門教程(一):基礎(chǔ)知識(shí)大雜燴,本文講解了注釋、頭文件、命名空間等內(nèi)容,需要的朋友可以參考下2014-11-11
C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法,結(jié)合實(shí)例形式分析了C++反轉(zhuǎn)鏈表的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08

