空指针(为缺少的输出数组调用的 create() 在 create,文件 /home/m/OpenCV/modules/

Null pointer (create() called for the missing output array) in create, file /home/m/OpenCV/modules/core/src/matrix_wrap.cpp, line 1461

本文关键字:create 文件 home modules OpenCV 输出 数组 空指针 调用      更新时间:2023-10-16

我正在尝试在O'reilly的书中运行Drawing labeled connected components的示例,但是我在运行时收到以下错误消息(我构建源代码没有问题(:

#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 componnentsn" << "Call is:n" <<argv[0] <<" imagenn";
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(( 创造

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

使用调试器显示此异常在调用 connectedComponentsWithStats(( 期间出现。错误的描述推断出这具有不应以这种方式的空/空。

OpenCV当前的文档显示,第四个参数,质心,应该是一个 CV_64F矩阵,有 2 列和"质心"行数。只要存在,此矩阵就可能由函数本身初始化。

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

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

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