C++ Opencv ROI根据图像特征而不是坐标设置
我首先尝试使用Canny边缘检测器获取图像的边缘。这是第二幅图像的黄色部分,但我想自动获得ROI(红色部分),但不是通过图像的坐标 我通过控制低阈值和高阈值的变量来设置阈值以获得精细的边缘 通过这段代码,我没有发现图像的坏边缘,但我遇到了一个问题,即无法获得边缘内部的ROI 如果你能给我任何帮助,我将不胜感激 以下是我检测图像边缘的代码:C++ Opencv ROI根据图像特征而不是坐标设置,c++,opencv,roi,C++,Opencv,Roi,我首先尝试使用Canny边缘检测器获取图像的边缘。这是第二幅图像的黄色部分,但我想自动获得ROI(红色部分),但不是通过图像的坐标 我通过控制低阈值和高阈值的变量来设置阈值以获得精细的边缘 通过这段代码,我没有发现图像的坏边缘,但我遇到了一个问题,即无法获得边缘内部的ROI 如果你能给我任何帮助,我将不胜感激 以下是我检测图像边缘的代码: #include <opencv\cv.h> #include <opencv\highgui.h> #include <W
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <Windows.h>
int high_switch_value = 0;
int highint = 0;
int low_switch_value = 0;
int lowint = 0;
void switch_callback_h(int position)
{
highint = position;
}
void switch_callback_l(int position)
{
lowint = position;
}
int main(int argc, char* argv[])
{
int N = 7;
IplImage* img = cvLoadImage("C:\\Users\\user\\Pictures\\sigfox\\Original_image.bmp",0);
IplImage* img_b = cvCreateImage(cvSize(img->width+N-1,img->height+N-1),
img->depth,img->nChannels);
IplImage* out = cvCreateImage(cvGetSize(img_b),IPL_DEPTH_8U,img_b->nChannels);
CvPoint offset = cvPoint((N-1)/2,(N-1)/2);
cvCopyMakeBorder(img,img_b,offset,IPL_BORDER_REPLICATE,cvScalarAll(0));
cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
cvNamedWindow("source",CV_WINDOW_AUTOSIZE);
int aperature_size = N;
double low_thresh = 20;
double high_thresh = 40;
cvCreateTrackbar("HIGH","result",&high_switch_value,4,switch_callback_h);
cvCreateTrackbar("LOW","result",&low_switch_value,4,switch_callback_l);
while(1)
{
switch(highint)
{
case 0:
high_thresh = 200;
break;
case 1:
high_thresh = 400;
break;
case 2:
high_thresh = 600;
break;
case 3:
high_thresh = 800;
break;
case 4:
high_thresh = 1000;
break;
}
switch(lowint)
{
case 0:
low_thresh = 0;
break;
case 1:
low_thresh = 100;
break;
case 2:
low_thresh = 200;
break;
case 3:
low_thresh = 400;
break;
case 4:
low_thresh = 600;
break;
}
cvCanny(img_b,out,low_thresh*N*N,high_thresh*N*N,aperature_size);
cvShowImage("result",out);
cvShowImage("source",img);
if(cvWaitKey(15) == 27)
{
break;
}
}
cvReleaseImage(&img);
cvReleaseImage(&img_b);
cvReleaseImage(&out);
cvDestroyWindow("result");
return 0;
}
#包括
#包括
#包括
int高_开关_值=0;
int-highint=0;
int low_开关_值=0;
int-lowint=0;
无效开关\u回调\u h(内部位置)
{
highint=位置;
}
无效开关\u回调\u l(内部位置)
{
lowint=位置;
}
int main(int argc,char*argv[])
{
int N=7;
IplImage*img=cvLoadImage(“C:\\Users\\user\\Pictures\\sigfox\\Original\u image.bmp”,0);
IplImage*img_b=cvCreateImage(cvSize(img->width+N-1,img->height+N-1),
img->深度,img->n通道);
IplImage*out=cvCreateImage(cvGetSize(img_b)、IPL_DEPTH_8U、img_b->nChannels);
CvPoint offset=CvPoint((N-1)/2,(N-1)/2);
cvCopyMakeBorder(img,img_b,offset,IPL_BORDER_REPLICATE,cvScalarAll(0));
cvNamedWindow(“结果”,CV_窗口_自动调整大小);
cvNamedWindow(“源”,CV_窗口_自动调整大小);
int-aperture_size=N;
双低_阈值=20;
双高_阈值=40;
cvCreateTrackbar(“高”、“结果”和高开关值,4,开关回调);
cvCreateTrackbar(“低”、“结果”和低开关值,4,开关回调值);
而(1)
{
开关(高输入)
{
案例0:
高_阈值=200;
打破
案例1:
高_阈值=400;
打破
案例2:
高_阈值=600;
打破
案例3:
高_阈值=800;
打破
案例4:
高_阈值=1000;
打破
}
开关(lowint)
{
案例0:
低_阈值=0;
打破
案例1:
低_阈值=100;
打破
案例2:
低_阈值=200;
打破
案例3:
低_阈值=400;
打破
案例4:
低_阈值=600;
打破
}
cvCanny(img_b、out、低_阈值*N*N、高_阈值*N*N、孔径大小);
cvShowImage(“结果”,输出);
cvShowImage(“来源”,img);
如果(cvWaitKey(15)==27)
{
打破
}
}
cvReleaseImage(&img);
cvReleaseImage(&img_b);
cvReleaseImage(&out);
“结果”;
返回0;
}
请避免使用opencv不推荐的c-api。使用cv::Mat,而不是IplImage*这样的代码不应该再被编写了。@berak谢谢!我会学习更多。谢谢你的建议:)我为你整理了问题布局……一个不相关的建议:避免#包括,即使在windows上,你也应该使用#包括(可移植性问题)不清楚你如何定义投资回报率:垂直,好的,它由上下边缘定义。但是横向的呢?标准是什么?