2012-01-28 6 views
0

トラックバーを使用せずに1つの色を検出するにはどうすればよいですか? 私はその範囲内のすべての色付きオブジェクトを取得しようとしています。私はQtとopenCVを使用しています。QtとopenCVを使用して画像の色範囲を指定します

私はトラックバーを使用してこのコードを添付しました:

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

+0

'C++'とタグ付けされていますが、古くなったc-apiを使用しています。それをしないでください。 – berak

答えて

0

1)cvCvtColor機能を使用してHSV色空間に画像を変換します。

2)HSVプレーンを分割してH、S、Vプレーンを分離します。

3)次に、色のH、S、V値が必要です。つまり、その色範囲の値の範囲です。

4)このカラーのみを抽出するには、cvInrangeS関数を使用します。それは白くなり、他のすべての色は黒くなります。あなたが唯一の黄色を検出するためのコードをしたい場合は

さて、このtutorial.