2012-01-28 111 views
0

如何在不使用軌跡條的情況下檢測一種顏色(識別一個顏色範圍)? 我試圖讓所有有色物體在該範圍內,我正在使用Qt和openCV。使用Qt和openCV識別圖像中的顏色範圍

我已經把它貼使用的TrackBar此代碼:

CvSeq* find_contour = NULL; 
    bool isStop = false; 
    img = cvLoadImage(QFileDialog::getOpenFileName(this, "Ouvrir un fichier", "/../../Fichiers Image", "Image (*.jpg *.bmp *.jpeg)").toStdString().c_str(),3); 
    if(img == NULL) 
    { 
    printf("capture device not found!!"); 

    } 


    Allocate_imgs(); 

    // creat windows 
    cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE); 
    cvNamedWindow("Result", CV_WINDOW_AUTOSIZE); 


    // To in_rang_filter() MIN , MAX RGB value set 
    cvCreateTrackbar("minR","Result",&mR_val, 256,set_RGB); 
    cvCreateTrackbar("minG","Result",&mG_val, 256,set_RGB); 
    cvCreateTrackbar("minB","Result",&mB_val, 256,set_RGB); 

    cvCreateTrackbar("maxR","Result",&MAR_val, 256,set_RGB); 
    cvCreateTrackbar("maxG","Result",&MAG_val, 256,set_RGB); 
    cvCreateTrackbar("maxB","Result",&MAB_val, 256,set_RGB); 
    // 


    cvCvtColor(img, imgHsv, CV_BGR2HSV);//convert the color space 
    in_rang_filter(); 


    cvShowImage("Capture", img); 
    cvShowImage("Result", test); 
    cvWaitKey(0); 
    cvReleaseImage(&imgResult); 
    cvReleaseImage(&imgHsv); 
    cvDestroyAllWindows(); 

} 


void in_rang_filter() 
{ 
    IplImage* test=cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); 
    CvScalar min_color = CV_RGB(mR_val,mG_val,mB_val); 
    CvScalar max_color = CV_RGB(MAR_val,MAG_val,MAB_val); 
    cvInRangeS(imgHsv, min_color,max_color, imgResult);//search for the color in image 

    cvCvtColor(imgResult, test,CV_GRAY2RGB); 
    cvShowImage("Result", test); 
    cvReleaseImage(&test); 
} 

void Allocate_imgs() 
{ 
    const int w = img->width; 
    const int h = img->height; 
    imgResult = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U,1); 
    imgHsv=cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3); 
+1

是什麼Qt的與此有關? – Bart 2012-01-28 16:01:10

+0

它被標記爲'C++',但你使用的是過時的c-api。不要這樣做。 – berak 2014-02-07 09:11:58

回答

0

1)使用cvCvtColor功能轉換圖像HSV色彩空間。 2)分離HSV平面以分離H,S,V平面。 3)接下來,您需要H,S,V值來表示您的顏色,我的意思是,該顏色範圍內的一系列值。

4)現在使用cvInrangeS函數僅提取該顏色。它會變白,所有其他顏色變黑。

現在,如果你想要的代碼僅用於檢測黃色,試試這個tutorial.