Google Code Prettify

2013年9月30日 星期一

OpenCV Extract colors 用HSV空間 分離顏色



從RGB轉到HSV空間中得到:

H:色相      0~360度
S:飽和度   0~1
V:明度      (黑)0~1(白)

在顏色分明的情況時,色相(H)可以很容易地將顏色分離出來


OpenCV也很棒的有RGB轉HSV現成的函式可以使用

不過要注意的是

在U8中,最大值只有255,因此OpenCV有做了調整

H:0~180   H/2
S:0~255   S*255
V:0~255   V*255


編譯環境為:

mac lion mountain 10.8

opencv 2.4.6

Xcode 4.6(在這邊基本上相容visual c++)


下面是code:
//
//  opencv 2.4.6 Extract Color
//
//  Created by vince on 13/9/30.
//  Copyright (c) 2013年 vince. All rights reserved.
//
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
    Mat src; //原圖片
    Mat hsv; //轉到hsv平面
    Mat dst; //結果圖片
    Mat r,r2,g,b; //各顏色的閥值
    
    //在hsv空間中 紅255介於 0度和360度交接處(想像成本初經線) 因此宣告r和r2確保不會少掉部分的紅色
    
    src=imread("/Users/mac/Documents/MyCode/OpenCV/opencv 2.4.6 test/opencv 2.4.6 test/color.bmp");
    
    Mat mask=Mat::zeros(src.rows,src.cols, CV_8U); //為了濾掉其他顏色
    
    cvtColor(src,hsv,CV_BGR2HSV);//轉成hsv平面
    
    inRange(hsv,Scalar(0,100,120) , Scalar(10,255,255), r);                
    //二值化:h值介於0~10 & s值介於100~255 & v值介於120~255
    inRange(hsv,Scalar(170,100,120) , Scalar(180,255,255), r2);            
    //二值化:h值介於170~180 & s值介於100~255 & v值介於120~255
    inRange(hsv,Scalar(50,100,120) ,Scalar(70,255,255), g);                
    //二值化:h值介於50~70 & s值介於100~255 & v值介於120~255
    inRange(hsv,Scalar(110,100,120) , Scalar(130,255,255), b);             
    //二值化:h值介於110~130 & s值介於100~255 & v值介於120~255
    
    mask=r+r2+g+b;//全部的二值化圖累加起來就變成遮罩
    
    src.copyTo(dst,mask ); //將原圖片經由遮罩過濾後,得到結果dst
    
    imshow("b",b);//show b
    imshow("mask",mask);//show mask
    imshow("src",src);//show原圖片
    imshow("result",dst);//show結果
    
    waitKey();
}
結果如下圖:





























HSV空間:參考 HSV wiki定義



1 則留言:

  1. 實際測試發現:
    1.r與b好像參數給相反了
    2.r2位置也在藍色區域

    不過還是感謝分享~謝拉

    回覆刪除