**
hsv模型中顏色的引數分別是:色調(h:hue),飽和度(s:saturation),亮度(v:value)。由a. r. smith在2023年建立的一種顏色空間, 也稱六角錐體模型(hexcone model)。
設 (r, g, b) 分別是乙個顏色的紅、綠和藍座標,它們的值是在 0 到 1 之間的實數。設 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 *
60if h <
0, h = h +
360
v=max(r,g,b)
s=(max
-min)/max
opencv下有個函式可以直接將rgb模型轉換為hsv模型,注意的是opencv中h∈ [0, 180), s ∈ [0, 255], v ∈ [0, 255]。我們知道h分量基本能表示乙個物體的顏色,但是s和v的取值也要在一定範圍內,因為s代表的是h所表示的那個顏色和白色的混合程度,也就說s越小,顏色越發白,也就是越淺;v代表的是h所表示的那個顏色和黑色的混合程度,也就說v越小,顏色越發黑。經過實驗,識別藍色的取值是 h在100到140,s和v都在90到255之間。一些基本的顏色h的取值可以如下設定:
orange
0-22
yellow
22- 38
green
38-75
blue
75-130
violet 130-160
red160-179
cvtcolor(imgoriginal, imghsv, color_bgr2hsv);
然後我們對彩色影象做直方圖均衡化
//因為我們讀取的是彩色圖,直方圖均衡化需要在hsv空間做
split(imghsv, hsvsplit);
equalizehist(hsvsplit[2],hsvsplit[2]);
merge(hsvsplit,imghsv);
接著就是進行顏色檢測,我們用void inrange(inputarray src, inputarray lowerb, inputarray upperb, outputarray dst);函式進行顏色檢測,這個函式的作用就是檢測src影象的每乙個畫素是不是在lowerb和upperb之間,如果是,這個畫素就設定為255,並儲存在dst影象中,否則為0。
inrange(imghsv, scalar(ilowh, ilows, ilowv), scalar(ihighh, ihighs, ihighv), imgthresholded); //threshold the image
通過上面的函式我們就可以得到目標顏色的二值影象,接著我們先對二值影象進行開操作,刪除一些零零星星的噪點,再使用閉操作,連線一些連通域,也就是刪除一些目標區域的白色的洞。
//開操作 (去除一些噪點)
mat element = getstructuringelement(morph_rect, size(5, 5));
morphologyex(imgthresholded, imgthresholded, morph_open, element);
//閉操作 (連線一些連通域)
morphologyex(imgthresholded, imgthresholded, morph_close, element);
整個**實現
#include
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using
namespace cv;
using
namespace
std;
int main( int argc, char** argv )
namedwindow("control", cv_window_autosize); //create a window called "control"
int ilowh = 100;
int ihighh = 140;
int ilows = 90;
int ihighs = 255;
int ilowv = 90;
int ihighv = 255;
//create trackbars in "control" window
cvcreatetrackbar("lowh", "control", &ilowh, 179); //hue (0 - 179)
cvcreatetrackbar("highh", "control", &ihighh, 179);
cvcreatetrackbar("lows", "control", &ilows, 255); //saturation (0 - 255)
cvcreatetrackbar("highs", "control", &ihighs, 255);
cvcreatetrackbar("lowv", "control", &ilowv, 255); //value (0 - 255)
cvcreatetrackbar("highv", "control", &ihighv, 255);
while (true)
mat imghsv;
vector
hsvsplit;
cvtcolor(imgoriginal, imghsv, color_bgr2hsv); //convert the captured frame from bgr to hsv
//因為我們讀取的是彩色圖,直方圖均衡化需要在hsv空間做
split(imghsv, hsvsplit);
equalizehist(hsvsplit[2],hsvsplit[2]);
merge(hsvsplit,imghsv);
mat imgthresholded;
inrange(imghsv, scalar(ilowh, ilows, ilowv), scalar(ihighh, ihighs, ihighv), imgthresholded); //threshold the image
//開操作 (去除一些噪點)
mat element = getstructuringelement(morph_rect, size(5, 5));
morphologyex(imgthresholded, imgthresholded, morph_open, element);
//閉操作 (連線一些連通域)
morphologyex(imgthresholded, imgthresholded, morph_close, element);
imshow("thresholded image", imgthresholded); //show the thresholded image
imshow("original", imgoriginal); //show the original image
char key = (char) waitkey(300);
if(key == 27)
break;
}return
0;}
經典的顏色識別的經典應用就是車牌定位了,因為中國的車牌無非就是藍色和黃色,還有就是交通標誌定位也是個應用。比如下面兩張,有很明顯的顏色區分。
opencv 顏色識別
include include opencv2 highgui highgui.hpp include opencv2 imgproc imgproc.hpp using namespace cv using namespace std int main int argc,char argv nam...
opencv 顏色物體識別跟蹤
hsv顏色空間與人眼較為接近,一般以hsv為顏色檢測和識別 h 色調 紅 綠 藍 s 飽和度 顏色深淺 v 亮度 顏色亮暗 opencv h範圍 0 180 s 0 255 v 0 255 hsv二值化處理的函式cv exports w void inrange inputarray src,inp...
基於Opencv的顏色識別
hsv模型中顏色的引數分別是 色調 h hue 飽和度 s saturation 亮度 v value 由a.r.smith在1978年建立的一種顏色空間,也稱六角錐體模型 hexcone model 1 色調 h hue 用角度度量,取值範圍為0 360 從紅色開始按逆時針方向計算,紅色為0 綠色...