objective-c - OpenCV 的 imread() 方法遇到问题 - Mat mask.data 始终返回 null(目标 C)
问题描述
我正在开发一个从图像中检测红色小矩形的应用程序。我有一个代码(从这里的答案中获得)显然可以做到这一点。
代码说明我需要使用imread()
带有字符串文件名的方法作为参数。
步骤:我打开相机。我拍了一张照片,将其显示在屏幕上并将其保存到应用程序的文件目录中。然后,使用提到的代码,我使用imread()
来引用图像并完成工作。
我不知道我做错了什么还是什么,但是mask.data
ALWAYS returns NULL
。我认为问题在于imread()
给定的文件路径错误,因此Mat3b brg
为空,然后创建错误。
有人可以启发我吗?
以下是我到目前为止得到的代码:
//The snippet begins after the picture is taken
//First Part of Method - closing the camera and adding the result view
[photoCam stop];
resultView = [[UIImageView alloc] initWithFrame:imageView.bounds];
UIImage* result = image;
[resultView setImage:result];
resultView.center = imageView.center;
[self.view addSubview:resultView];
//Second Part of the Method - saving the image to a file
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"image.png"];
[UIImagePNGRepresentation(result) writeToFile:filePath atomically:YES];
//Third Part of the Method - reading the red rectangles
Mat3b bgr = cv::imread("image.png"); // Here is where I believe the problem is. HELP!!!!
//Already tried the absolute path of the image, like
// "/var/mobile/Containers/Data/Application/BAB824A7-C7C1-4D1E-BB4A-43A003F30F1A/Documents/image.png"
// Didn't work either.
Mat3b hsv;
cvtColor(bgr, hsv, COLOR_BGR2HSV);
Mat1b mask1, mask2;
inRange(hsv, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1);
inRange(hsv, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2);
Mat1b mask = mask1 | mask2;
if (mask.data == NULL)
{
NSLog(@"mask.data == null");
}
else
{
namedWindow("Mask", CV_WINDOW_AUTOSIZE);
imshow("Mask", mask);
waitKey();
}
提前致谢。
解决方案
在得到帮助后Micka
,我找到了问题的解决方案。
我试图使用该imread()
方法读取图像,该方法没有找到文件路径(无论我使用什么路径),因此没有返回任何内容,所以最终mask.data
返回 NULL。
Micka
建议我阅读OpenCV 官方论坛上发布的这条线索。在第一个答案中,有人建议使用 UIImage 将图像作为参数传递,而不是使用文件的路径。所以,这就是我所做的,瞧,mask.data
正在返回图像的值。
这是成功的代码:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"image.png"];
[UIImagePNGRepresentation(result) writeToFile:filePath atomically:YES];
UIImage* resImage = [UIImage imageWithContentsOfFile:filePath];
cv::Mat3b bgr;
UIImageToMat(resImage, bgr);
Mat3b hsv;
cvtColor(bgr, hsv, COLOR_BGR2HSV);
谢谢Micka
!
推荐阅读
- pandas - 如何为每个组生成唯一的 id 和 sub_id
- python-3.x - 使用循环一次创建多个列
- graphql - 使用 graphQL 在突变中发送对象数组
- r - 对齐x轴并在R中的多图图形上添加轴标签
- c# - 使用 MailGun (C#) 将 base 64 编码的 PDF 附加到 RestRequest 电子邮件
- java - Docx4j:SpreadsheetMLPackage - java.lang.ExceptionInInitializerError
- c++ - 在程序变得低效之前,允许多少新 [] 和删除 [] 分配有限制吗?
- c - 为什么即使 ASLR 开启,__libc_start_main 的地址在 GDB 中总是相同的?
- php - 在 MySQL 中使用 SQL 服务器和 PHP/触发器“而不是”
- python - 对于字典列表中的每个值,在 python 中打印相应的值