OpenCV顏色識別

2021-08-03 19:00:24 字數 4245 閱讀 4304

**

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 綠色...