1. 程式人生 > >【opencv】目標識別——HSV顏色識別

【opencv】目標識別——HSV顏色識別

首先解釋為什麼不在RGB中設定範圍尋找物體資訊,而是在HSV中:

因為RGB通道並不能很好地反映出物體具體的顏色資訊 , 而相對於RGB空間,HSV空間能夠非常直觀的表達色彩的明暗,色調,以及鮮豔程度,方便進行顏色之間的對比,比如紅色在HSV空間中H維度的範圍為0~10和160~180 你跟我說在RGB中它的範圍是什麼呢?

下面是通過實驗計算的模糊範圍(準確的範圍在網上都沒有給出)。

H:  0 — 180

S:  0 — 255

V:  0 — 255

在HSV空間各種顏色的範圍

圖來自:http://blog.csdn.net/taily_duan/article/details/51506776

但是這個範圍相對我們要尋找或者識別的物體還是太大,容易誤判,因此我們需要藉助PS尋找更精確的範圍

點選吸管工具那個圖示,選擇HSB顏色

但是HSV顏色空間卻規定的是,H範圍0~360,S範圍0~1,V範圍0~1 

PS中的HSV範圍,H是0-360,S是0-1,V(B)是0-1

opencv中的HSV範圍,H是0-180,S是0-255,V是0-255

因此需要轉換一下

把PS中H的值除以2,S乘255,V乘255,可以得到對應的opencv的HSV值

在PS中某個物體上移動滑鼠,可以大致看出物體顏色的HSV三個分量的範圍,用這三個範圍來識別物體

識別程式碼如下:

void hsvreg()
{
    Mat img = imread("藍色筆筒.jpg",1);
 
    Mat imgHSV;  
 
    //藍色筆筒顏色的HSV範圍
    int iLowH = 100 /2;  
    int iHighH = 120 /2;  
 
    int iLowS = 50 *255/100;   
    int iHighS = 70 *255/100;  
 
    int iLowV = 40 *255/100;  
    int iHighV = 50 *255/100;  
 
    cvtColor(img, imgHSV, COLOR_BGR2HSV);//轉為HSV
 
    imwrite("hsv.jpg",imgHSV);
 
    Mat imgThresholded;
 
    inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image  
 
    //開操作 (去除一些噪點)  如果二值化後圖片干擾部分依然很多,增大下面的size
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));  
    morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);  
  
    //閉操作 (連線一些連通域)  
    morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);  
  
    namedWindow("Thresholded Image",CV_WINDOW_NORMAL);
    imshow("Thresholded Image", imgThresholded); 
    
    //這裡是自定義的求取形心函式,當然用連通域計算更好
    //Point center;
    //center = GetCenterPoint(imgThresholded);//獲取二值化白色區域的形心
 
    //circle(img, center, 100, Scalar(0,0,255), 5, 8, 0);//繪製目標位置
    imwrite("end.jpg", img);
 
    waitKey(0);
}


--------------------- 
作者:BHY_ 
來源:CSDN 
原文:https://blog.csdn.net/qq_15947787/article/details/72784253 
版權宣告:本文為博主原創文章,轉載請附上博文連結!