当我尝试在 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_32F
或 CV_64F
。但是,UIImage
通常有 4 个频道。我打赌你的 UIImageToMat
会产生一个 CV_8UC3
类型的垫子。所以mat
有CV_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 时,为啥我的应用程序会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章