C++ 传递mat参考时出现opencv malloc错误
我目前正在obj-c/c++下将matlab代码移植到opencv,遇到了一个malloc问题。通过垫子时一切正常,但如果我通过imageChannel的通道:C++ 传递mat参考时出现opencv malloc错误,c++,objective-c,opencv,C++,Objective C,Opencv,我目前正在obj-c/c++下将matlab代码移植到opencv,遇到了一个malloc问题。通过垫子时一切正常,但如果我通过imageChannel的通道: cv::Mat *imageChannel = new cv::Mat[c]; cv::split(image, imageChannel); This is my code: 它抛出几个malloc错误: OpenCvTest(15537,0xb0081000) malloc: *** error for object 0x1191
cv::Mat *imageChannel = new cv::Mat[c];
cv::split(image, imageChannel); This is my code:
它抛出几个malloc错误:
OpenCvTest(15537,0xb0081000) malloc: *** error for object 0x11915000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
这是我的密码:
+(cv::Mat)boxFilterWithImage:(cv::Mat)image r:(int)r
{
int hei = image.rows;
int wid = image.cols;
int c = image.channels();
cv::Mat imDst = cv::Mat::zeros(hei, wid, CV_32FC(c));
cv::Mat imCum = [self cumSumWith:image dim:1];
imCum.colRange(r, 2*r).copyTo(imDst.colRange(0, r));
cv::Mat calc = imCum.colRange((2*r+2)-1, wid-1) - imCum.colRange(0, (wid-2*r-1)-1);
calc.copyTo(imDst.colRange(r+1, (wid-r)-1));
cv::repeat(imCum.col(wid-1), 1, r, calc);
calc -= imCum.colRange((wid-2*r)-1, wid-r-1);
calc.copyTo(imDst.colRange((wid-r+1)-2, wid-1));
imCum = [self cumSumWith:imDst dim:2];
imCum.rowRange(r, 2*r).copyTo(imDst.rowRange(0, r));
calc = imCum.rowRange((2*r+2)-1, hei-1) - imCum.rowRange(0, (hei-2*r-1)-1);
calc.copyTo(imDst.rowRange(r+1, hei-r-1));
cv::repeat(imCum.row(hei-1), r, 1, calc);
calc -= imCum.rowRange((hei-2*r)-2, (hei-r-1)-1);
calc.copyTo(imDst.rowRange(hei-r-1, hei-1));
return imDst;
}
有人对此有线索吗
编辑:
所以我有时间调试它:
它似乎有问题
imCum.rowRange(r, 2*r).copyTo(imDst.rowRange(0, r));
第一个子矩阵在提取后被释放
问候,,
卡斯滕我通常以这种方式处理频道:
vector<Mat> src_arr;
cv::split(src,src_arr);
Mat tmp;
// You can do the loop here
MyFuncForSingleChannel(src_arr[0]);
tmp.copyTo(src_arr[0]);
MyFuncForSingleChannel(src_arr[1]);
tmp.copyTo(src_arr[1]);
MyFuncForSingleChannel(src_arr[2]);
tmp.copyTo(src_arr[2]);
cv::merge(src_arr,dst);
向量src\u arr;
cv::split(src,src_arr);
Mat-tmp;
//你可以在这里做循环
MyFuncForSingleChannel(src_arr[0]);
tmp.copyTo(src_arr[0]);
MyFuncForSingleChannel(src_arr[1]);
tmp.copyTo(src_arr[1]);
MyFuncForSingleChannel(src_arr[2]);
tmp.copyTo(src_arr[2]);
合并(src_arr,dst);
我通常以这种方式处理频道:
vector<Mat> src_arr;
cv::split(src,src_arr);
Mat tmp;
// You can do the loop here
MyFuncForSingleChannel(src_arr[0]);
tmp.copyTo(src_arr[0]);
MyFuncForSingleChannel(src_arr[1]);
tmp.copyTo(src_arr[1]);
MyFuncForSingleChannel(src_arr[2]);
tmp.copyTo(src_arr[2]);
cv::merge(src_arr,dst);
向量src\u arr;
cv::split(src,src_arr);
Mat-tmp;
//你可以在这里做循环
MyFuncForSingleChannel(src_arr[0]);
tmp.copyTo(src_arr[0]);
MyFuncForSingleChannel(src_arr[1]);
tmp.copyTo(src_arr[1]);
MyFuncForSingleChannel(src_arr[2]);
tmp.copyTo(src_arr[2]);
合并(src_arr,dst);
谢谢你的回复:我也尝试了向量,但结果是一样的谢谢你的回复:我也尝试了向量,但结果是一样的两个问题,1。第一行的c
是什么。。?2.代码是否正确编译。。?您的系统配置是什么(即是UNIX还是Windows)?1。int c=image.channels();因此,图像2的通道。是的,它编译时没有错误3。下面是几个问题,1。第一行的c
是什么。。?2.代码是否正确编译。。?您的系统配置是什么(即是UNIX还是Windows)?1。int c=image.channels();因此,图像2的通道。是的,它编译时没有错误3。它在OSX下