首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递mat引用时出现opencv malloc错误

传递mat引用时出现opencv malloc错误
EN

Stack Overflow用户
提问于 2013-11-19 00:52:07
回答 1查看 1.5K关注 0票数 1

我目前正在将matlab代码移植到obj-c/c++下的opencv中,我遇到了一个malloc问题。传递Mat时一切正常,但如果我传递来自imageChannel的通道:

代码语言:javascript
复制
cv::Mat *imageChannel = new cv::Mat[c];
cv::split(image, imageChannel); This is my code:

它抛出了几个malloc错误:

代码语言:javascript
复制
OpenCvTest(15537,0xb0081000) malloc: *** error for object 0x11915000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

以下是我的代码:

代码语言:javascript
复制
+(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;
}

有谁知道这方面的线索吗?

编辑:所以我有时间对它进行调试:看起来它有问题

代码语言:javascript
复制
imCum.rowRange(r, 2*r).copyTo(imDst.rowRange(0, r));

第一个子矩阵在提取后被释放。

致敬,卡斯汀

EN

回答 1

Stack Overflow用户

发布于 2013-11-19 01:04:27

我通常是这样处理通道的:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20053229

复制
相关文章

相似问题

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