抓取功能出错 - Objective-C ++ OpenCV

时间:2017-07-10 12:31:37

标签: opencv malloc objective-c++

我的Objective-C ++用OpenCV库编写的抓取算法存在问题。 我想像你在这张照片中看到的那样使用抓取来检测球:

example picture

这是我的代码:

Mat imageMat;
Mat grab;
Mat result;
Mat bgdModel;
Mat fgdModel;

//x,y: user selection
NSInteger xInt = [x integerValue];
NSInteger yInt = [y integerValue];

UIImageToMat(image, imageMat);
cv::cvtColor(imageMat , grab , CV_RGBA2RGB);
cv::Rect rectangle( xInt-125,yInt-125,250,250);

cv::grabCut(grab, result, rectangle, bgdModel, fgdModel, 1, cv::GC_INIT_WITH_RECT );
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
cv::Mat foreground(grab.size(),CV_8UC3, cv::Scalar(255,255,255));
result=result&1;
grab.copyTo(foreground, result);
return MatToUIImage(grab);

以下是我收到的错误消息:

Boule(18731,0x1b3b33b40) malloc: *** mach_vm_map(size=1560002560) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc

你知道什么是错的吗? 非常感谢提前!

1 个答案:

答案 0 :(得分:0)

根据错误消息,代码正在尝试分配一个巨大的图像。

我会直接做的一些事情:

  1. 替换

    NSInteger xInt = [x integerValue]; NSInteger yInt = [y integerValue];

  2. int xInt = [x intValue];
    int yInt = [y intValue];
    

    因为我不太确定cv :: Rect()是否会获得发送到此方法的实际输入。

    1. 添加一个检查以查看矩形的原点是否仍在图像中,如果不是则调整矩形(尽管如此,grabCut看起来还不错)。
    2. 我将代码转换为C ++,并且在删除NSIntegers后它运行时没有错误。在手机上试用后会更新答案,但请尝试上述更改。