OpenCV导致EXC_BAD_ACCESS线程1:代码= 2在UIApplicationMain中崩溃

时间:2014-01-14 08:15:45

标签: c++ objective-c opencv exc-bad-access

帮助:

它在设备上崩溃了。它在模拟器中崩溃了。但它不会在仪器工具中崩溃。我承认,我还在学习如何使用Instruments工具,也许我没有设置正确的设置来捕获错误。但是我已经在这方面工作了好几天,这让我发疯了。我的所有代码似乎执行得非常好。我正在使用NSNotificationCenter进行回调。当执行返回到视图并且数据在我的代码中设置时,数据就在那里。 当视图即将显示新数据时出现问题。相反,视图消失,应用程序因EXC_BAD_ACCESS错误而崩溃。我完全被难倒了。

我对NSZombie如何使用“乐器”工具感到困惑。一些说明说你不能在仪器工具中使用NSZombiesEnabled。我也无法成功查看日志。也许我正在尝试查看错误的日志,因为我看到的日志似乎不是人类可读的格式。

当我们开始(在C ++中)将CVMat位图转换为灰度级进行处理,在C ++中处理图像,然后在C ++中转换回颜色以进行显示时,我几乎99.9%确信问题就出现了。但即使在它周围放置一个try / catch块也没有发现错误。 Objective-C中的回调接收UIImage。

异步调用,多种语言,包装器,OpenCV库,许多故障点。我认为,由于种种原因,我必须成为仪器工具的专家,但现在我迫切希望得到任何建议。

我现在正在阅读Ray Wenderlich教程,但感谢其他可能遇到类似问题的人提供的信息。

1 个答案:

答案 0 :(得分:4)

我真正希望找到的是,在代码处理完成后,其他人在汇编代码中的某个地方出现了这个错误,就像发生在我身上一样。我无法设置任何断点,因为它似乎没有出现在我的代码中。但经过很多耐心和一些额外的目光,我终于找到了根本原因。

这是一个OpenCV问题!!! 我将错误缩小到发生错误的方法(不是很容易,因为它没有停止在该调用上)但是在之后将cvMatFromUIImage方法拆分为两个方法(一个将图像转换为cv :: Mat,另一个转换为颜色)错误消失了。

- (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
    CGFloat cols = image.size.width;
    CGFloat rows = image.size.height;

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  data
                                                    cols,                       // Width of bitmap
                                                    rows,                       // Height of bitmap
                                                    8,                          // Bits per component
                                                    cvMat.step[0],              // Bytes per row
                                                    colorSpace,                 // Colorspace
                                                    kCGImageAlphaNoneSkipLast |
                                                    kCGBitmapByteOrderDefault); // Bitmap info flags

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
    CGContextRelease(contextRef);

    return cvMat;
}

- (cv::Mat)convertToRGB:(cv::Mat)grayMat
{
    cv::Mat rgbMat;
    cv::cvtColor(grayMat, rgbMat, CV_RGBA2RGB);
    return rgbMat;
}

我希望这有助于其他人!