Image processing openCv中的边缘检测产生运行时错误

Image processing openCv中的边缘检测产生运行时错误,image-processing,opencv,edge-detection,Image Processing,Opencv,Edge Detection,我使用了cvCanny函数来检测边缘 cvCanny( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size ); 但在运行时,它会给出运行时错误。错误消息根本不清楚。它指的是某个内存位置。请帮帮我 代码: 你离这项工作非常接近。基本上,以下是您的问题: 您正在循环中创建一个窗口。由于窗口每次都具有相同的名称,因此只需创建一次即可 你正在破坏你的图像,然后才能显示它们。调用cvShowImage时,图像不会显示,而是在调用cvW

我使用了cvCanny函数来检测边缘

cvCanny( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size ); 
但在运行时,它会给出运行时错误。错误消息根本不清楚。它指的是某个内存位置。请帮帮我

代码:


你离这项工作非常接近。基本上,以下是您的问题:

  • 您正在循环中创建一个窗口。由于窗口每次都具有相同的名称,因此只需创建一次即可
  • 你正在破坏你的图像,然后才能显示它们。调用
    cvShowImage
    时,图像不会显示,而是在调用
    cvWaitKey
    时显示。到那时,您已经释放了图像,因此不会显示任何内容
  • 您正在释放从
    CvCapture
    加载的帧。文档中明确指出,要做到这一点,
函数cvQueryFrame获取一个 来自摄影机或视频文件的帧, 将其解压缩并返回。这 函数只是 GrabFrame和RetrieveFrame,但在 一个电话返回的图像应为 不得由承包商发布或修改 用户。如果发生错误,则 返回值可能为空

  • 您没有在任何地方初始化
    image\u b
    out
    。它们甚至没有在你发布的代码中声明我不知道你的代码是如何编译的,更不用说运行了
  • 您正在指定
    image\u b
    作为canny边缘检测的源,而实际上它应该是
    frame
  • 你没有释放视频捕获结构
就像我说的,有很多微小的点。下面是有效的代码:

#include <stdlib.h>
#include <cv.h>
#include <highgui.h>
//
// Comment this out to use the webcam.
//
#define LOAD_IMAGE "/home/misha/Desktop/Lenna.png"
int main(int argc, char **argv)
{
    const char *name = "Edge Detection Window";
    int N = 7;
#ifndef LOAD_IMAGE
    CvCapture *capture = cvCaptureFromCAM(1);
#endif
    IplImage *frame = NULL;
    IplImage *out = NULL;

    cvNamedWindow(name, 1);

    while (1) 
    {
#ifdef LOAD_IMAGE
        frame = cvLoadImage(LOAD_IMAGE, 0);
#else
        frame = cvQueryFrame(capture);
#endif
        out = cvCreateImage(cvGetSize(frame), frame->depth, frame->nChannels);

        int aperature_size = N;
        double lowThresh = 20;
        double highThresh = 40;

        highThresh = 800;
        lowThresh = 100;

        cvCanny(frame, out, lowThresh * N * N, highThresh * N * N,
                aperature_size);

        cvShowImage(name, out);
#ifndef LOAD_IMAGE
        if (cvWaitKey(15) == 27)
            break;
#else
        cvWaitKey(0);
        break;
#endif
        }
    cvReleaseImage(&out);
    cvDestroyWindow(name);
#ifdef LOAD_IMAGE
    cvReleaseImage(&frame);
#else
    cvReleaseCapture(&capture);
#endif
    return 0;
}
标准图像和输出:


请发布实际的错误消息-还有什么编译器、操作系统等?您的阈值看起来太高了。img_b和out的格式是什么?运行gdb,以便在抛出异常时提供回溯!请尝试并提供一个指向整个源代码的链接。因为这看起来更像是一个调试问题,而不是逻辑错误。我正在尝试运行您的代码。请尝试删除尽可能多的不相关代码。轨迹栏、卷积边界等等——你不需要它们来重现问题。如果结果是这样,那么你就知道问题是什么了:PI想要实时执行此操作。@devon:只需注释掉循环末尾的“break;”行,它就会继续处理。(并注释掉LOAD_图像。)代码不错/回答不错,@misha!
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>
//
// Comment this out to use the webcam.
//
#define LOAD_IMAGE "/home/misha/Desktop/Lenna.png"
int main(int argc, char **argv)
{
    const char *name = "Edge Detection Window";
    int N = 7;
#ifndef LOAD_IMAGE
    CvCapture *capture = cvCaptureFromCAM(1);
#endif
    IplImage *frame = NULL;
    IplImage *out = NULL;

    cvNamedWindow(name, 1);

    while (1) 
    {
#ifdef LOAD_IMAGE
        frame = cvLoadImage(LOAD_IMAGE, 0);
#else
        frame = cvQueryFrame(capture);
#endif
        out = cvCreateImage(cvGetSize(frame), frame->depth, frame->nChannels);

        int aperature_size = N;
        double lowThresh = 20;
        double highThresh = 40;

        highThresh = 800;
        lowThresh = 100;

        cvCanny(frame, out, lowThresh * N * N, highThresh * N * N,
                aperature_size);

        cvShowImage(name, out);
#ifndef LOAD_IMAGE
        if (cvWaitKey(15) == 27)
            break;
#else
        cvWaitKey(0);
        break;
#endif
        }
    cvReleaseImage(&out);
    cvDestroyWindow(name);
#ifdef LOAD_IMAGE
    cvReleaseImage(&frame);
#else
    cvReleaseCapture(&capture);
#endif
    return 0;
}
gcc -ggdb -Wall -o devan.out devan.c `pkg-config --cflags --libs opencv`