Image processing openCv中的边缘检测产生运行时错误
我使用了cvCanny函数来检测边缘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( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size );
但在运行时,它会给出运行时错误。错误消息根本不清楚。它指的是某个内存位置。请帮帮我
代码:
你离这项工作非常接近。基本上,以下是您的问题:
- 您正在循环中创建一个窗口。由于窗口每次都具有相同的名称,因此只需创建一次即可
- 你正在破坏你的图像,然后才能显示它们。调用
时,图像不会显示,而是在调用cvShowImage
时显示。到那时,您已经释放了图像,因此不会显示任何内容cvWaitKey
- 您正在释放从
加载的帧。文档中明确指出,要做到这一点,不:CvCapture
- 您没有在任何地方初始化
或image\u b
。它们甚至没有在你发布的代码中声明我不知道你的代码是如何编译的,更不用说运行了out
- 您正在指定
作为canny边缘检测的源,而实际上它应该是image\u b
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`