【发布时间】:2016-08-17 20:48:40
【问题描述】:
我正在实现一种分解图像的方法,它将图像作为输入并返回许多图像作为输出,称为 BEMC。这是我的主要功能,我尝试仅返回第一个 BEMC:
int main(int argc, char **argv)
{
if (argc != 2) {
std::cout << "Usage: ./emd <image>" << std::endl;
return 1;
}
cv::Mat inputImg;
cv::Mat imgMode;
inputImg=imread(argv[1],CV_LOAD_IMAGE_COLOR);
if(! inputImg.data )
{ cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow("Source Image",WINDOW_AUTOSIZE);
imshow("Source Image",inputImg);
cv::waitKey(1000);
Mat gray;
cvtColor(inputImg,gray,COLOR_BGR2GRAY);
Mat grayy;
gray.convertTo(grayy, CV_32F);
sprintf(modeTitle, "BEMC-%d", 1);
std::cout << "Decomposition " << modeTitle << std::endl;
cv::Mat imgMod(grayy) , result;
imgMod = decompose(grayy); *************main.cpp:387********
//**** decompose is the function that generate the error******
...........................
...........................
}
这是我的函数分解的一部分,首先我试图找到图像的最大值,然后我试图将它们存储到我用来做其他事情的向量中:
cv::Mat decompose(cv::Mat input )
{
cv::Mat inputImg;
input.copyTo(inputImg);
std::vector<Euclidean> vectEMax, vectEMin;
cv::Mat imgMax;
...................................
vectEMax.push_back(max);vectEMax.push_back(min);
................................
std::vector<Euclidean>::iterator it1, it2;
..............................
我正在使用迭代器来计算最大值之间的距离,所有这些操作都可以正常工作,我将元素插入 vectEMax 并计算没有任何问题。在程序结束时,我必须返回一个图像作为该方法的结果。
cv::Mat imgMoyenne //imgMoyenne is an image based on maximas,calculted
in the program
....................
cv::Mat diff_im;
inputImg.copyTo(diff_im);
diff_im = inputImg - imgMoyenne ;
return diff_im;}*****************main.cpp:345**************
程序返回后崩溃,显示
* 检测到 glibc * ./gdb_core: double free or corruption (!prev): 0x08c33d78 ***
这是一个 gdb 输出
Program terminated with signal 6, Aborted.
#0 0xb7738424 in __kernel_vsyscall ()
thread apply all bt
Thread 1 (Thread 0xb4282740 (LWP 3652)):
#0 0xb773a424 in __kernel_vsyscall ()
#1 0xb6f1f1df in __GI_raise (sig=6)
at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2 0xb6f22825 in __GI_abort () at abort.c:91
#3 0xb6f5c39a in __libc_message (do_abort=2,
fmt=0xb70578e8 "*** glibc detected *** %s: %s: 0x%s ***\n")
at ../sysdeps/unix/sysv/linux/libc_fatal.c:201
#4 0xb6f66ee2 in malloc_printerr (action=<optimized out>,
str=<optimized out>, ptr=0x8c33d78) at malloc.c:5039
#5 0xb7549c22 in cv::fastFree(void*) ()
from /usr/local/lib/libopencv_core.so.2.4
#6 0xb763e78b in cv::Mat::deallocate() ()
from /usr/local/lib/libopencv_core.so.2.4
#7 0x0804c1fd in cv::Mat::release (this=0xbfda1fc8)
at /usr/local/include/opencv2/core/mat.hpp:367
#8 0x0804c055 in cv::Mat::~Mat (this=0xbfda1fc8, __in_chrg=<optimized out>)
at /usr/local/include/opencv2/core/mat.hpp:276
#9 0x0804b24c in decompose (input=...) at main.cpp:345
#10 0x0804b87f in main (argc=2, argv=0xbfda25a4) at main.cpp:387
我需要你的帮助
【问题讨论】:
-
看起来
diff_im正在堆栈上创建,因此它在创建它的函数之外不可用。相反,您应该使用在堆上创建diff_imnew运算符,然后返回一个指向它的指针。 -
或将您的功能更改为:
void decompose(cv::Mat input, cv::Mat& output) -
@pgngp 谢谢你的回复,我创建了类似
cv::Mat* diff = new cv::Mat(inputImg- imgMoyenne);的diff_im,我将方法的返回类型更改为cv::Mat* decompose(cv::Mat input)和cv::Mat* imgMod = new cv::Mat(grayy); imgMod = decompose(grayy); (main function),但我仍然有同样的错误 -
@incBrain 谢谢你的回复,我在你的建议之前和现在都试过这个方法,但我仍然有同样的错误。
-
@ImaneEL:您提到您创建了
diff_im,如cv::Mat* diff = new cv::Mat(inputImg- imgMoyenne);,其中指针名称为diff,而不是diff_im。希望您在返回语句中使用了正确的名称,对吧?
标签: c++ opencv free corruption