在iOS上使用imread()

时间:2017-06-26 07:47:10

标签: ios objective-c swift opencv imread

我正在尝试将OpenCV与iOS配合使用。当我通过Xcode使用应用程序中包含的图像时,一切正常。

但是我需要读取通过相机拍摄的图像。我已经在StackOverflow和其他网站上测试了很多建议,但没有运气。

我尝试过使用OpenCV的UIImageToMat,我尝试将图像保存到设备上的Documents Directory,然后通过imread()读取该文件。

不幸的是,Mat对象的数据为NULL,矩阵为空。有没有人有任何想法?

let filename = getDocumentsDirectory().appendingPathComponent("temp.jpg")
try? dataImage.write(to: filename)

let test = OpenCVWrapper()
let plate = test.getLicensePlate(filename.absoluteString)
print(plate ?? "nil")

我已经检查过文件确实存在于文件目录中,所以我真的不知道发生了什么!

1 个答案:

答案 0 :(得分:0)

好的,经过几个小时的挫折,我有它的工作。在这里发布我的解决方案给其他希望使用iOS的OpenALPR库的人(以及使用imread()扩展OpenCV)。

首先,上面的代码使用URL路径,使用.absolutestring方法转换为String。此路径不适用于imread()。您将需要使用以下内容:

if let image = UIImage(data: dataImage)?.fixOrientation() {
    if let data = UIImageJPEGRepresentation(image, 1) {

        var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        path.append("/temp.jpg")
        try? data.write(to: URL(fileURLWithPath: path))

        let cv = OpenCVWrapper()
        plate = cv.getLicensePlate(path)
        print(plate ?? "nil")
    }
}

如果您正在执行方向敏感的分析,则需要在处理之前修复捕获的图像方向。有关说明,请参阅here

以下是上述链接中提到的UIImage扩展的Swift 3版本:

extension UIImage {

    func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
        return CGRect(x: x, y: y, width: width, height: height)
    }

    func fixOrientation() -> UIImage {
        if self.imageOrientation == UIImageOrientation.up {
            return self
        }

        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        self.draw(in: CGRectMake(0, 0, self.size.width, self.size.height))
        let normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        return normalizedImage;
    }
}