Opencv 基于鼠标点击的HSV分割
我正在尝试做一些基本的图像分割。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
#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值,但随后单击时显示为零。