当我尝试在 openCV 中反转 UIImage 时,为啥我的应用程序会崩溃?

Posted

技术标签:

【中文标题】当我尝试在 openCV 中反转 UIImage 时,为啥我的应用程序会崩溃?【英文标题】:Why is my app crashing when I try to invert a UIImage in openCV?当我尝试在 openCV 中反转 UIImage 时,为什么我的应用程序会崩溃? 【发布时间】:2018-11-09 01:07:43 【问题描述】:

我已经玩了很长时间了,但由于某种原因我无法运行以下代码。

+(UIImage *)processInvertedImage:(UIImage *)image 

    cv::Mat mat;
    UIImageToMat(image, mat);   ///this is CV_8U from iPhone camera

    cv::Mat output;
    mat.convertTo(output, CV_32F);   ///cv::invert() requires CV_32F!! (apparently)

    cv::Mat invert;
    cv::invert(output, invert);     /// app crashes here, error message below

    cv::Mat gray;
    cv::cvtColor(invert, gray, CV_RGB2GRAY);  

    UIImage *binImg = MatToUIImage(gray);

    return binImg;


我收到以下错误代码:

libc++abi.dylib:以 cv::Exception 类型的未捕获异常终止:OpenCV(3.4.2) /Volumes/build-storage/build/3_4_ios-mac/opencv/modules/core/src/lapack。 cpp:839: 错误: (-215:Assertion failed) type == 5 ||在函数“反转”中键入 == 6

这个类型是什么== 5 || type == 6 是什么意思?

【问题讨论】:

不是重复的,但非常相似的问题here。你有他的问题。有关详细信息,请参阅我的回答和评论。 嗨广,是的,这是我昨天的问题。只需要再问一次,因为在我介绍了您的建议后它实际上仍然不起作用。 您建议转换为 CV_32F,但仍然崩溃并显示完全相同的错误消息,所以这里肯定有其他问题。 转成灰度然后做反转功能不是更好吗?需要 CV_23F 的 invert 有可能吗? 我没有注意到同一张海报。我在这里添加一个答案。 【参考方案1】:

让我试着永远回答这个问题。 type == 5 || type == 6 表示您需要使用 CV_32FCV_64F。但是,UIImage 通常有 4 个频道。我打赌你的 UIImageToMat 会产生一个 CV_8UC3 类型的垫子。所以matCV_8UC3 类型,output 很可能有CV_32FC3 类型,而不仅仅是CV_32F。同样,当您使用cv::invert() 时,您看到的是数学逆,即output * mat = identity_matrix

+(UIImage *)processInvertedImage:(UIImage *)image 

    cv::Mat mat;
    UIImageToMat(image, mat);   ///this is CV_8U from iPhone camera

    if (mat.type() == CV_8UC3) 
        NSLog(@"mat type is CV_8UC3"); // mostlikely this
     else if (mat.type() == CV_8UC4)
        NSLog(@"mat type is CV_8UC4");
    

    cv::Mat output;
    mat.convertTo(output, CV_32F);   ///cv::invert() requires CV_32F!! (apparently)
    if (output.type() == CV_32FC3)
        NSLog(@"output type is CV_32FC3"); // most likely this 
    

    // this is really bad naming, since you seem to use namespace cv somewhere, 
    // as CV_32F doesn't have cv:: prefix
    cv::Mat invert;                
    cv::invert(output, invert);     /// app crashes here, error message below

    cv::Mat gray;
    cv::cvtColor(invert, gray, CV_RGB2GRAY);  

    UIImage *binImg = MatToUIImage(gray);

    return binImg;


编辑:如果您需要 图像处理 逆,那么您可以执行与上一个问题类似的操作:

+(UIImage *)processInvertedImage:(UIImage *)image 
    cv::Mat mat;
    UIImageToMat(image, mat);

    // convert to RGB
    cv::Mat rgb
    cv::cvtColor(mat, rgb, COLOR_RGBA2RGB);

    // create mat of same size and type with values 255
    cv::Mat dummy(rgb.size(), rgb.type(), cv::Scalar(255,255,255));

    // three channels
    cv::Mat rgb_invert = dummy ^ rgb;

    cv::Mat gray;
    cv::cvtColor(rgb, gray, COLOR_RGB2GRAY);

    cv::Mat gray_invert = 255 ^ gray;

    // depending what invert you would like
    UIImage* binImg = MatToUIImage(rgb_invert);

    return binImg;

【讨论】:

好的,运行它。是 CV_8UC4。在遇到 CV_32F 问题之前就崩溃了 当你说它在 invert 函数中崩溃时,我相信你:D。你可以通过cv::cvtColor(mat, gray, COLOR_RGBA2GRAY)gray.convertTo(output, CV_32F) 到处走走。但是,invert 将是CV_32F,而不是RGB,即CV_8UC3。无论如何,我仍然不确定您为什么需要图像的数学逆 我其实不需要数学逆。我误解了这一点。我想要的只是将深色背景更改为浅色背景,这是我进行形状识别所需要的。你建议什么功能 按照上面的建议运行它,错误消息现在已更改为:libc++abi.dylib: terminating with unaught exception of type cv::Exception: OpenCV(3.4.2) /Volumes/build -storage/build/3_4_iOS-mac/opencv/modules/core/src/lapack.cpp:863: 错误: (-215:Assertion failed) m == n in function 'invert' 那是因为只有方阵才有数学逆元。请参阅编辑以了解图像处理逆向。

以上是关于当我尝试在 openCV 中反转 UIImage 时,为啥我的应用程序会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

c++ OpenCV 示例到 iOS 代码和 UIImage

xCode 中的 OpenCV 错误:输入参数的大小不匹配

使用Python,OpenCV反转视频

目标 C:使用 UIImage 进行描边

opencv 实现图像像素点反转

当我尝试在 OpenCV IOS 中归因变量时发生奇怪的崩溃