2014-01-31 2 views
0

Я пытаюсь выполнить некоторую базовую сегментацию изображения. Пороговые значения для HSV должны определяться по значению пикселя, на которое нажимается мышь. Я не могу заставить его работать. Вот что я написал до сих пор:Сегментация HSV на основе щелчка мыши

#include <iostream> 
#include "opencv2/opencv.hpp" 
#include <cv.h> 
#include "opencv/highgui.h" 

using namespace std; 
using namespace cv; 

Mat edges,frame,bw,hsv,dst,src_gray,probabilistic_hough, HSV_image; 
int H=110,S=40,V=140; 
int border=80; 
int linethreshold=180,linelengthslider=30,linegapslider=3, HT_threshold=10; 
int min_threshold = 50; 

void printHSVValues(int event, int x, int y, int, void*); 
void changeborder(int, void*); 

Scalar hsvlow(0,0,0),hsvhigh(180,255,255); 

int c=0; 

void printHSVValues(int event, int x, int y, int, void*); 

int main (int argc, char **argv) 
{ 
    VideoCapture cap(1); 

    namedWindow("edges",1); 
    namedWindow("segmented",1); 

    setMouseCallback("edges", printHSVValues, 0); 

    while (c != 'q') { 
     cap >> frame; 
     imshow("edges",frame); 
     c= (char)waitKey(100); 
    } 

    return 0; 
} 

void printHSVValues(int event, int x, int y, int, void*){ 

    int loop; 
    float change; 

    if(event == EVENT_LBUTTONDOWN) { 
     cvtColor(frame, HSV_image, CV_BGR2HSV); 
     Vec3b p = HSV_image.at<float>(y,x); 
     for (loop=0;loop<3;loop++) { 
      change=p[loop]*0.01; 
      hsvlow[loop] = p[loop] - change; 
      hsvhigh[loop] = p[loop] + change; 
     } 
     inRange(HSV_image, hsvlow,hsvhigh,bw); 
     imshow("segmented",bw); 
    } 
} 

Куда я перепутал? Заранее спасибо.

DY.

+0

Как это работает? Пожалуйста, будьте более конкретными. – herohuyongtao

+0

Вы можете изменить строку 'Vec3b p = HSV_image.at (y, x);' to 'Vec3b p = HSV_image.at (y, x);' Также убедитесь, что вы вычисляете правильное значение HSV – Haris

+0

@herohuyongtao : Мои извинения. Это не работает в том смысле, что, когда я нажимаю на объект, я хочу получить значения HSV, выбранное изображение (как показано в сегментированном) равно нулю. Также выражение printf в функции printHSVValues ​​(не показано здесь) показывает ненулевое значение HSV при первом нажатии на него, но при последующих щелчках оно равно нулю. – user3259040

ответ

0

Правильно вы не получаете значения Mat. Изображение имеет 3 канала, поскольку вы правильно назначили переменную типа Vec3b, но вы получите значение float из изображения. Правильный путь:

Vec3b p = HSV_image.at<Vec3b>(y,x); 
+0

Спасибо. Кажется, это работает. – user3259040

+0

Если решение работает, вы должны принять ответ. – littleimp

Смежные вопросы