OpenCV导致EXC_BAD_ACCESS Thread 1: code=2在UIApplicationMain中崩溃

3
帮助:
设备上崩溃。模拟器中崩溃。但是在Instruments工具中不会崩溃。我承认,我还在学习如何使用Instruments工具,也许没有设置正确的设置来捕获错误。但我已经在这个问题上工作了几天,它让我发疯。我的所有代码似乎都在完美地执行。我正在使用NSNotificationCenter进行回调。当执行返回视图时,数据存在,并且在我的代码中设置了数据。问题出现在视图即将显示新数据时。相反,视图消失,并且应用程序由于EXC_BAD_ACCESS错误而崩溃。我完全被卡住了。
我对NSZombie与Instruments工具的工作原理感到困惑。有些说明说您不能在Instruments工具中使用NSZombiesEnabled。我也无法成功查看日志。也许我试图查看错误的日志,因为我查看的日志似乎不是人类可读格式。
我几乎确信,当我们开始(在C++中)转换CVMat位图以进行处理时,问题开始出现,将图像在C++中处理,然后在C++中将其转换回彩色以显示。但是,即使在它周围放置一个try/catch块也无法捕获错误。Objective-C中的回调接收UIImage。
异步调用、多种语言、包装器、OpenCV库、许多故障点。我认为,成为Instruments工具的专家非常重要,但现在我迫切需要任何建议。
我正在阅读Ray Wenderlich的教程,但感激其他人提供的经验教训。

展示使用代码?设置异常断点?发布精确的错误信息? - Grzegorz Krukowski
不应该在没有评论的情况下对一个问题进行负评。 - Patricia
1个回答

5
我真正希望找到的是,有其他人在代码处理完成后,在汇编代码中遇到了这个错误。我无法设置断点,因为它似乎并没有在我的代码中发生。但是经过耐心等待和几双额外的眼睛,我终于找到了根本原因。
这是一个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;
}

我希望这能帮助其他人!


1
你救了我的命 :) - hrishioa
你好, 我是新手,遇到了你在答案中提到的类似问题。除了在哪里更改颜色以外,我都明白了,我的意思是何时和何地调用这个新方法“convertToRGB”?如果您能稍微解释一下,那将非常有帮助。另外,我还遇到了未声明的标识符“CV_RGBA2RGB”。 - Renascent
@Renascent 我认为你可能需要声明它。请参阅此链接:https://docs.rs/opencv/0.5.2/opencv/imgproc/constant.CV_RGBA2RGB.html - Patricia
@Renascent,虽然这个答案是针对微软的,但它可能也会对你有所帮助:https://social.msdn.microsoft.com/Forums/vstudio/en-US/0f134f91-7a68-4973-9cf6-ac504b8906e7/error-c2065-colorbgr2gray-undeclared-identifier?forum=vcgeneral - Patricia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接