首页 > 解决方案 > 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();
}

提前致谢。

标签: objective-copencv

解决方案


在得到帮助后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


推荐阅读