Opencv 基于鼠标点击的HSV分割

Opencv 基于鼠标点击的HSV分割,opencv,image-segmentation,Opencv,Image Segmentation,我正在尝试做一些基本的图像分割。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,probab

我正在尝试做一些基本的图像分割。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);
    }
}
#包括
#包括“opencv2/opencv.hpp”
#包括
#包括“opencv/highgui.h”
使用名称空间std;
使用名称空间cv;
Mat边缘、帧、bw、hsv、dst、src_灰度、概率_hough、hsv_图像;
int H=110,S=40,V=140;
int-border=80;
int linethreshold=180,linelengthslider=30,LineGapsSlider=3,HT_threshold=10;
int min_阈值=50;
无效打印hsv值(int事件、int x、int y、int、void*);
void changeborder(int,void*);
标量hsvlow(0,0,0),hsvhigh(180255255);
int c=0;
无效打印hsv值(int事件、int x、int y、int、void*);
int main(int argc,字符**argv)
{
视频捕捉帽(1);
名称(“边缘”,1);
名称(“分段”,1);
setMouseCallback(“边”,printHSV值,0);
而(c!=“q”){
cap>>框架;
imshow(“边缘”,框架);
c=(字符)等待键(100);
}
返回0;
}
无效打印HSV值(int事件、int x、int y、int、void*){
内环;
浮动变化;
if(event==event_LBUTTONDOWN){
CVT颜色(帧、HSV_图像、CV_BGR2HSV);
Vec3b p=HSV_图像在(y,x)处;

对于(loop=0;loop您未正确访问Mat值。正确分配变量类型
Vec3b
,但您从图像中检索
float
值时,图像有3个通道。正确的方法是:

Vec3b p = HSV_image.at<Vec3b>(y,x);
Vec3b p=HSV_图像在(y,x)处;

它是如何工作的?请更具体一些。您可以将行
Vec3b p=HSV_image.at(y,x);
更改为
Vec3b p=HSV_image.at(y,x);
还要确保您计算的HSV是正确的value@herohuyongtao:很抱歉。当我单击要获取HSV值的对象时,所选图像(以分段方式显示)为零,从这个意义上讲,它不起作用。此外,printHSVValues函数中的printf语句(此处未显示)第一次单击时显示非零HSV值,但随后单击时显示为零。