Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opencv ROI根据图像特征而不是坐标设置_C++_Opencv_Roi - Fatal编程技术网

C++ Opencv ROI根据图像特征而不是坐标设置

C++ Opencv ROI根据图像特征而不是坐标设置,c++,opencv,roi,C++,Opencv,Roi,我首先尝试使用Canny边缘检测器获取图像的边缘。这是第二幅图像的黄色部分,但我想自动获得ROI(红色部分),但不是通过图像的坐标 我通过控制低阈值和高阈值的变量来设置阈值以获得精细的边缘 通过这段代码,我没有发现图像的坏边缘,但我遇到了一个问题,即无法获得边缘内部的ROI 如果你能给我任何帮助,我将不胜感激 以下是我检测图像边缘的代码: #include <opencv\cv.h> #include <opencv\highgui.h> #include <W

我首先尝试使用Canny边缘检测器获取图像的边缘。这是第二幅图像的黄色部分,但我想自动获得ROI(红色部分),但不是通过图像的坐标

我通过控制低阈值和高阈值的变量来设置阈值以获得精细的边缘

通过这段代码,我没有发现图像的坏边缘,但我遇到了一个问题,即无法获得边缘内部的ROI

如果你能给我任何帮助,我将不胜感激

以下是我检测图像边缘的代码:

#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上,你也应该使用
#包括
(可移植性问题)不清楚你如何定义投资回报率:垂直,好的,它由上下边缘定义。但是横向的呢?标准是什么?