【问题标题】:OpenCV Error: Null pointer with cannyOpenCV 错误:带有 canny 的空指针
【发布时间】:2015-07-26 10:37:47
【问题描述】:

我正在尝试学习 C 和 OpenCV。我正在使用以下代码,其灵感来自 O'Reilly Learning OpenCV,但出现错误并且图像未按预期显示。这段代码有问题吗?

# include "cv.h"
# include "highgui.h"

IplImage * doCanny(IplImage *in, double lowThresh, double highThresh, int aperture) {

    if(1 != in->nChannels){
        return 0;
    }

    IplImage *out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
    cvCanny(in, out, lowThresh, highThresh, aperture);
    return out;
}

/* This layout works with other functions like cvPyrdown, but for some reason it doesn't work with cvCanny */   
int main() {

    double lowThresh = 50;
    double highThresh = 150;
    int aperture = 3;

    IplImage *img = cvLoadImage("/tmp/lena.jpg", CV_LOAD_IMAGE_UNCHANGED);
    IplImage *out = doCanny(img, lowThresh, highThresh, aperture);

    cvNamedWindow("Example2-6", CV_LOAD_IMAGE_UNCHANGED);
    cvShowImage("Example2-6", out);
    cvWaitKey(0);
    cvReleaseImage(&img);
    cvReleaseImage(&out);
    cvDestroyWindow("Example2-6");

    return 0;
}

我在 Mac OS X Yosemite 上得到的输出是:

OpenCV 错误:cvGetMat 中的空指针(传递了空数组指针),文件 /opt/local/var/macports/build/.../opencv-2.4.11/.../array.cpp,第 2382 行

【问题讨论】:

  • 请使用 opencv 的 c++ api,不要使用过时的,不再维护的 c-api

标签: c opencv


【解决方案1】:

您的 jpg 图像很可能是三通道图像。您将此图像作为in 传递给您的doCanny() 函数。以下代码将导致doCanny()函数返回0:

if(1 != in->nChannels){
    return 0;
}

那么你不检查你的doCanny()函数的返回值是否有效。因此,您将一个空指针传递给以下函数,这可能会导致您的空指针错误:

cvShowImage("Example2-6", out);

为了使您的代码能够处理三通道图像,您应该将doCanny() 函数中的in 图像转换为单通道图像:

IplImage * doCanny(IplImage *in, double lowThresh, double highThresh, int aperture) {
    IplImage *out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);

    /* Convert the three-channel input image into a single-channel image. */
    IplImage* oneChannel = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); 
    cvCvtColor(in, oneChannel, CV_BGR2GRAY);

    cvCanny(oneChannel, out, lowThresh, highThresh, aperture);
    return out;
}

或者,您可以通过将CV_LOAD_IMAGE_GRAYSCALE 作为第二个参数传递给cvLoadImage(),直接将输入图像加载为单通道图像:

IplImage *img = cvLoadImage("/tmp/lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);

无论如何,您应该始终检查函数返回的值是否有效。

【讨论】:

    【解决方案2】:

    它对我有用:

     #include "opencv/cv.h"
     #include "opencv/highgui.h"
     #include "opencv2/core/core_c.h"
    
     using namespace cv;
     IplImage * doCanny(IplImage *in, double lowThresh, double highThresh, int aperture) 
      {
        if(1 != in->nChannels)
        { return 0; }
    
        IplImage *out = cvCreateImage(cvGetSize(in),IPL_DEPTH_8U, 0);
        cvCanny(in, out, lowThresh, highThresh, aperture);
        return (out);
      }
    
    
     int main() 
     {
        double lowThresh = 50;
        double highThresh = 150;
        int aperture = 3;
    
        IplImage *img = cvLoadImage("/tmp/lena.jpg",0);
        IplImage *out = doCanny(img, lowThresh, highThresh, aperture);
    
        cvNamedWindow("Example2-6", 0);
        cvShowImage("Example2-6", out);
        cvWaitKey(0);
        cvReleaseImage(&img);
        cvReleaseImage(&out);
        cvDestroyWindow("Example2-6");
        return 0;
     }
    

    如果问题继续,请访问

    Opencv error 1

    Opencv error2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多