【问题标题】:(Adaptive) thresholding in opencv error (Bad argument (Unknown array type) in cvarrToMat)(自适应)opencv 错误中的阈值(cvarrToMat 中的错误参数(未知数组类型))
【发布时间】:2012-01-05 15:20:21
【问题描述】:

我正在尝试对我的视频流使用阈值,但它不起作用。

我的视频流:

Mat *depthImage = new Mat(480, 640, CV_8UC1, Scalar::all(0));

然后我尝试进行自适应阈值处理,(也不适用于常规阈值处理)

for(;;){

    if( wrapper->update()){


        wrapper->getDisplayDepth(depthImage);

        cvAdaptiveThreshold(depthImage, depthImage,255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY,75,10);


        imshow("Depth", *depthImage);

    }

    int k = waitKey(25);
    if(k == 27 ) exit(0);
}

我收到此错误:

OpenCV 错误:cvarrToMat 中的错误参数(未知数组类型),文件 /Users/olivierjanssens/source/OpenCV-2.3.1/modules/core/src/matrix.cpp,第 646 行 终止称为抛出异常

我做错了什么,我可以完美地显示并看到流。但是当我添加这个阈值时,我得到了前面提到的错误。 (顺便说一句,我对 opencv 比较陌生)。

提前谢谢!

【问题讨论】:

  • 你确定这条线是正确的吗? imshow("Depth", *depthImage);
  • 是的,因为那条线在没有阈值线的情况下工作。如果我删除它,这个设置没有任何变化。
  • 如果我将阈值线放在注释中并添加例如:'cvCircle(depthImage, cvPoint(point.X, point.Y), 20, cvScalar(0,255,0), 1) ;'要画一个圆圈,它会给出同样的错误。

标签: c++ image-processing opencv threshold


【解决方案1】:

你的 depthImage 是一个指向 cv::Mat 的指针,在我看来这很奇怪......

...但是,如果您使用的是 C++ 语法,那么您将需要使用处理 cv::MatC++ version of adaptiveThreshold,其定义如下:

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,
    int adaptiveMethod, int thresholdType, int blockSize, double C);

如果您还没有使用该命名空间,则需要以 cv:: 为前缀。

例如:

Mat *depthImage; // Obtain this using your method
Mat image = *depthImage;  // Obtain a regular Mat to use (doesn't copy data, just headers)

adaptiveThreshold(image, image,255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY,75,10);

imshow("Depth Image", *depthImage);
// OR
imshow("Depth Image", image);

【讨论】:

  • 非常感谢,这行得通。我对 C++ 还是有点陌生​​,很抱歉这个奇怪的问题。
  • 当使用边缘检测时,我应该使用 cvCanny(depthImage, depthImage, 1.0, 1.0, 3); ?还是使用那个图像变量?
  • 我定义 Mat image 是因为我不喜欢使用指针,并且因为这通常是大多数 C++ OpenCV 函数的准备方式。如果您可以更改从视频流中获取图像的方式(您没有发布任何这些详细信息,所以我不知道是否可以)为您的代码提供Mat 而不是Mat* 那么它会更容易。
  • 另外,请记住您需要来自 OpenCV 的 C++ 函数,请参阅cv::Canny documentation 和该参考站点。
  • 是的,我看了一下,您定义的方式有效。我正在使用包装器,我目前不想更改包装器中的任何内容,所以你的方式是完美的:)。
猜你喜欢
  • 2017-08-19
  • 1970-01-01
  • 2014-06-30
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多