UIImageToMat()保留先前调用的数据

时间:2018-11-30 17:55:52

标签: c++ ios objective-c opencv memory-management

我在iOS上使用OpenCV。

当我在grabCut文件中运行以下.mm函数并提供以下内容时:

inclStrokesImg enter image description here的绿色“ I”

exclStrokesImgenter image description here的红色“ E”

我希望分别看到inclStrokesDebugexclStrokesDebug的白色“ I”和“ E”,但是现在我看到了

“ inclStrokesDebug”的“ I”(预期) enter image description here

但为exclStrokesDebug的“ IE”(不正确,只能看到E) enter image description here

cv::Mat cvt2Mask (UIImage * img) {
    cv::Mat mask ;

    if (img == nil){
        return mask;
    }
    UIImageToMat(img, mask);
    cv::cvtColor(mask, mask, CV_RGBA2GRAY);
    cv::threshold(mask, mask, 1, 255, cv::THRESH_BINARY);

    return mask;
}

+(UIImage *)grabCut:(UIImage *)srcImg withMask:(UIImage *)maskImg andInclusiveStrokes:(UIImage *)inclStrokesImg andExclusiveStrokes:(UIImage *)exclStrokesImg {
    // Returns an inclusive mask image

    cv::Mat src;
    UIImageToMat(srcImg, src);

    cv::Mat mask = cvt2Mask(maskImg);
    cv::Mat inclStrokes = cvt2Mask(inclStrokesImg);
    cv::Mat exclStrokes = cvt2Mask(exclStrokesImg);

    #ifdef DEBUG
    UIImage * maskDebug = MatToUIImage(mask);
    UIImage * inclStrokesDebug = MatToUIImage(inclStrokes);
    UIImage * exclStrokesDebug = MatToUIImage(exclStrokes);
    #endif

    ...

    return ...;
}

我检查了cvt2mask函数,UIImageToMat()出错了,并返回了与先前结果相结合的结果。

我再次使用相同的参数运行grabCut函数,inclStrokesDebug现在将返回“ IE”而不是我在第一次调用中看到的“ I”。

是否由于某些内存未释放问题?

1 个答案:

答案 0 :(得分:0)

由于未知原因,我提供Alpha Bool时问题似乎已解决。我正在使用OpenCV 3.4.4

cv::Mat cvt2Mask (const UIImage * img) {
    ...
    UIImageToMat(img, maskX, true);
    ...

    return maskX;
}