我目前正在使用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:\builds\master_PackSlave_Win64-vc12-shared\opencv\modules\core\src\convert.cpp, line 941
我无法看到我可能做错了什么......确实,这是非常基本的OpenCV!
我使用的图片可通过此链接下载:https://transfert.u-psud.fr/gs67
对于天文爱好者来说,它是斯蒂芬的五重奏,与Calar Alto天文台的1.23米望远镜一起拍摄,我目前是一名实习生。
提前感谢您的帮助, 阿诺。
答案 0 :(得分:4)
我最近遇到了完全相同的错误,出现了一个有效的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);
}
这里的最后一行调用函数&#39; void cv :: merge(const Mat mv,size_t n,OutputArray _dst)*&#39;,其中有臭名昭着的第一行中的CV_Assert(mv&amp;&amp; n&gt; 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);
}
答案 1 :(得分:0)
虽然你可以用很少的行来编写它,但这段代码是有效的。