首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >断言失败,cv::merge

断言失败,cv::merge
EN

Stack Overflow用户
提问于 2015-08-03 05:33:03
回答 2查看 2.2K关注 0票数 0

我目前正在用openCV做一些C++图像处理。我在Mac上使用Xcode6.3.2开发了这个应用程序,它在调试和发布过程中都工作得很好。为了有一个Windows可执行程序,我现在使用Visual Studio Express 2013在Windows上工作。程序在调试模式下运行良好,但在发布模式下这部分代码崩溃:

代码语言:javascript
复制
#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);

}

我得到的错误是:

代码语言:javascript
复制
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.23米的望远镜拍摄的,我目前在那里实习。

先谢谢你的帮助,阿诺德。

EN

回答 2

Stack Overflow用户

发布于 2016-03-09 06:59:22

我最近遇到了完全相同的错误,出现了一个有效的openCV代码,它在调试模式下运行得很好,但在发布模式下运行得不好。

查看核心源代码,可以发现调用的函数包含以下代码( openCV /core/src/Convert.cpp,第341行):

代码语言:javascript
复制
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中。这会留下一个传递给merge函数的空数组,从而导致CV_Assert引发错误。

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

代码语言:javascript
复制
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:我知道这已经有一段时间了,但我想我还是会把答案贴出来,以防遇到同样问题的人也会遇到这个问题。

PS2:下面是完整的示例代码:

代码语言:javascript
复制
#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);
}
票数 4
EN

Stack Overflow用户

发布于 2016-01-04 23:45:01

尽管您可以用更少的代码行来编写它,但是这段代码是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31776845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档