cv::merge断言失败
Assertion failed with cv::merge
我目前正在用openCV做一些c++图像处理。我用Xcode 6.3.2在Mac上开发了这个应用程序,它在调试和发布时都运行得很好。为了有一个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:buildsmaster_PackSlave_Win64-vc12-sharedopencvmodulescoresrcconvert.cpp, line 941
我不知道我哪里做错了…的确,它是相当基本的OpenCV !
我使用的图片可以通过以下链接下载:https://transfert.u-psud.fr/gs67
对于天文爱好者来说,这是斯蒂芬五重奏,用卡拉阿尔托天文台的1.23米望远镜拍摄的,我目前在那里实习。
提前感谢你的帮助,Arnaud .
我最近遇到了完全相同的错误,出现了一个有效的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。这会留下一个空数组传递给merge函数,从而导致由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:我知道已经有一段时间了,但我想我还是会把答案贴出来,以防有人遇到同样的问题,会在这个问题上出现。
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);
}
虽然可以用更少的行来编写,但这段代码是有效的。
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 断言"id < 0"在Qt ActiveX中失败
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- MS 本机单元测试 - 断言::线程失败不起作用
- 为什么我的Qt程序在断言失败后继续运行?
- 图片不显示,关闭时出错 --> 调试断言失败!表达式:is_block_type_valid(标头>_block_use)
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 错误:断言失败 (src.type() == CV_8UC1) 在阈值中
- Boost Beast 异步服务器失败,断言失败:(id_ != T::id) 在多个 aync 调用中
- 使用imwrite OpenCV时断言失败
- 调试断言失败的缓冲区!=nullptr
- 使用 ofstream 写入文本文件时断言失败
- OpenCV 错误:相机校准:断言在matrix_wrap.cpp失败
- 提升继续恢复断言失败
- 获取有关调试断言失败的错误:表达式:"(_Ptr_user &(_BIG_ALLOCATION_ALIGNMENT -1)) == 0" &&0
- 打破gdb中失败断言的正确方法是什么