【问题标题】:Assertion failed with cv::mergecv::merge 断言失败
【发布时间】:2016-03-09 07:28:28
【问题描述】:

我目前正在使用 openCV 进行一些 C++ 图像处理。我在 Mac 上使用 Xcode 6.3.2 开发了该应用程序,它在调试和发布时都能完美运行。为了有一个 Windows 可执行程序,我现在正在使用 Visual Studio Express 2013 在 Windows 上工作。该程序在调试模式下运行良好,但在这部分代码的发布模式下崩溃:

#include "stdafx.h"
#include "math.h"
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/core/core_c.h"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/photo/photo.hpp"
#include "opencv2/features2d/features2d.hpp"


using namespace cv;
using namespace std;

int main(int argc, const char** argv)
{

vector<Mat> stacked_images;
Mat medianr_eq, mediang_eq, medianb_eq, objrgb;

medianr_eq = imread("C:\\Path\\medianr_eq.png", CV_LOAD_IMAGE_GRAYSCALE);
mediang_eq = imread("C:\\Path\\mediang_eq.png", CV_LOAD_IMAGE_GRAYSCALE);
medianb_eq = imread("C:\\Path\\medianb_eq.png", CV_LOAD_IMAGE_GRAYSCALE);

objrgb = Mat(medianr_eq.size(), CV_16UC3);

stacked_images.clear();

stacked_images.push_back(medianb_eq); /*B*/
stacked_images.push_back(mediang_eq); /*G*/
stacked_images.push_back(medianr_eq); /*R*/
merge(stacked_images, objrgb);

}

我得到的错误是:

OpenCV Error : Assertion failed <mv && n > 0> in cv::merge, file C:\builds\master_PackSlave_Win64-vc12-shared\opencv\modules\core\src\convert.cpp, line 941

我看不出我在哪里做错了......确实,这是非常基本的 OpenCV!

我使用的图片可以通过这个链接下载:https://transfert.u-psud.fr/gs67

对于天文学爱好者来说,这是斯蒂芬五重奏组,由卡拉尔奥托天文台的 1.23m 望远镜拍摄,我目前是那里的实习生。

提前感谢您的帮助, 阿诺。

【问题讨论】:

  • 您将 objrgb 声明为 CV_8UC1,而它应该是 CV_8UC3。但是,合并应该正确创建它...
  • 哦,是的,抱歉,我在最后一分钟更改了它...事实上,我之前使用的是 CV_16UC3(图像以 16 位编码),我也遇到了同样的问题。我要编辑我的问题。
  • 尝试使用您的图像。这个对我有用。但是,您可以删除 objrgb = Mat(medianr_eq.size(), CV_16UC3); 行,因为合并将创建 objrgb 正确的大小和类型。
  • 另外,imread 加载 CV_8UC3 图像,而不是 CV_16UC3
  • 好的,非常感谢。你在使用 Visual Studio 吗?你认为问题可能来自我的 OpenCV 库的安装吗?

标签: c++ opencv


【解决方案1】:

我最近遇到了完全相同的错误,显示有效的 openCV 代码在调试模式下运行得非常好,但在发布模式下却没有。

查看openCV源码,可以发现调用的函数有这段代码(modules/core/src/convert.cpp,第341行):

void cv::merge(InputArrayOfArrays _mv, OutputArray _dst)
{
    CV_OCL_RUN(_mv.isUMatVector() && _dst.isUMat(),
               ocl_merge(_mv, _dst))

    std::vector<Mat> mv;
    _mv.getMatVector(mv);
    merge(!mv.empty() ? &mv[0] : 0, mv.size(), _dst);
}

这里的最后一行调用函数'void cv::merge(const Mat mv, size_t n, OutputArray _dst)*',它有臭名昭著的CV_Assert( mv && n > 0 ); 指令在其第一行,导致运行时崩溃。

这个错误告诉我们 Mat 的向量要么是空指针/引用要么是空的,它显然不在你的代码中。我强烈怀疑错误出在 getMatVector 函数调用中,没有将 _mv 的内容复制到 mv 中。这会留下一个传递给合并函数的空数组,从而导致 CV_Assert 引发错误。

在我的例子中,解决方法是直接使用 convert.cpp 中第 200 行定义的函数原型。对您来说,这意味着(仅复制代码的最后几行):

stacked_images.clear();

stacked_images.push_back(medianb_eq); /*B*/
stacked_images.push_back(mediang_eq); /*G*/
stacked_images.push_back(medianr_eq); /*R*/
merge(&stacked_images[0], stacked_images.size(), objrgb);

这个解决方案在我的情况下有效,我的代码现在可以在调试和发布模式下愉快地运行!

PS:我知道已经有一段时间了,但我想我还是会发布答案,以防遇到同样问题的人会遇到这个 SO 问题。

PS2:这是一个完整的示例代码:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;


int main( int argc, char** argv )
{
    namedWindow( "Display window", WINDOW_AUTOSIZE );

    Mat result;

    Mat R = imread("Lenna.png", CV_LOAD_IMAGE_GRAYSCALE);
    Mat G = imread("Lenna.png", CV_LOAD_IMAGE_GRAYSCALE);
    Mat B = imread("Lenna.png", CV_LOAD_IMAGE_GRAYSCALE);

    // Changing channel values for final result that should look largely blue
    R = 0.1*R;
    G = 0.1*G;
    B = 1.5*B;

    std::vector<cv::Mat> array_to_merge ;

    array_to_merge.push_back(B);
    array_to_merge.push_back(G);
    array_to_merge.push_back(R);

    // This line triggers a runtime error in Release mode
    //cv::merge(array_to_merge,result); 

    // This line works both in Release and Debug mode   
    cv::merge(&array_to_merge[0], array_to_merge.size(), result);


    cv::imshow( "Display window", result );
    cv::waitKey(0);
}

【讨论】:

    【解决方案2】:

    虽然你可以用更少的行来编写它,但这段代码是有效的。

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2015-05-20
      • 2020-08-21
      • 2017-12-24
      相关资源
      最近更新 更多