代码之家  ›  专栏  ›  技术社区  ›  Hasani

在create,file/home/m/opencv/modules/core/src/matrix_wrap.cpp,第1461行中,为缺少的输出数组调用了空指针(create()。

  •  3
  • Hasani  · 技术社区  · 6 年前

    我想举个例子 Drawing labeled connected components 在O'Reilly的书中,但是我在运行时收到以下错误消息(我构建了没有问题的源代码):

    #include <opencv2/opencv.hpp>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    //using namespace cv;
    
    int main(int argc, char* argv[])
    {
        cv::Mat img, img_edge, labels, img_color, stats;
    // load image or show help if no image was provided
        if( argc != 2|| (img = cv::imread( argv[1], 0)).empty())
        {
            cout << "\nExample 8_3 Drawing Connected componnents\n" << "Call is:\n" <<argv[0] <<" image\n\n";
            return -1;
        }
        cv::threshold(img, img_edge, 128, 255, cv::THRESH_BINARY);
        cv::imshow("Image after threshold", img_edge);
        int i, nccomps = cv::connectedComponentsWithStats (
                             img_edge, labels,
                             stats, cv::noArray()
                         );
        cout << "Total Connected Components Detected: " << nccomps << endl;
        vector<cv::Vec3b> colors(nccomps+1);
        colors[0] = cv::Vec3b(0,0,0); // background pixels remain black.
        for( i = 1; i <= nccomps; i++ )
        {
            colors[i] = cv::Vec3b(rand()%256, rand()%256, rand()%256);
            if( stats.at<int>(i-1, cv::CC_STAT_AREA) < 100 )
                colors[i] = cv::Vec3b(0,0,0); // small regions are painted with black too.
        }
        img_color = cv::Mat::zeros(img.size(), CV_8UC3);
        for( int y = 0; y < img_color.rows; y++ )
            for( int x = 0; x < img_color.cols; x++ )
            {
                int label = labels.at<int>(y, x);
                CV_Assert(0 <= label && label <= nccomps);
                img_color.at<cv::Vec3b>(y, x) = colors[label];
            }
        cv::imshow("Labeled map", img_color);
        cv::waitKey();
        return 0;
    }
    

    opencv(3.4.1)错误:为缺少的调用了空指针(create()。 输出数组)在创建中,文件 /home/m/opencv/modules/core/src/matrix_wrap.cpp,第1461行终止 在引发“cv::exception”的实例后调用what(): opencv(3.4.1)/home/m/opencv/modules/core/src/matrix_wrap.cpp:1461: 错误:(-27)为函数中缺少的输出数组调用了create()。 创造

    问题是什么?我如何解决?

    1 回复  |  直到 6 年前
        1
  •  2
  •   DanyAlejandro    6 年前

    使用调试器显示,此异常在调用ConnectedComponentsWithStats()期间出现。错误的描述推断这是一个空/空的东西,不应该是那样的。

    开放式简历 current docs 证明第四个参数centroids应该是 cv f矩阵,2列,“质心”行数。这个矩阵可能是由函数本身初始化的,只要它存在。

    因此,您所需要的就是创建这个矩阵,并按照函数的预期提供它:

    cv::Mat centroids;
    int i, nccomps = cv::connectedComponentsWithStats (img_edge, labels, stats, centroids);
    

    您的问题在于使用Opencv3.4.1(最新版本),与您正在使用的书籍相比,它的语法发生了变化;这是任何开放源代码库的常见问题。我建议您保留当前的OpenCV文档,以确保书中的代码仍然有效,或者降级到旧版本。