ios - 从 UIImage 创建 cv::Mat 时出错

标签 ios objective-c opencv uiimage

我正在尝试使用 OpenCV 执行最简单的任务 - 将 UIImage 转换为灰色 cv::Mat 并收到此错误:

CGBitmapContextCreate: invalid data bytes/row: should be at least 12000 
for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipLast.

我正在使用通过 CocoaPods 连接的 OpenCV v 3.2.0 以及我在网上找到的示例代码:

- (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 channels

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to data
                                                cols,                       // Width of bitmap
                                                rows,                       // Height of bitmap
                                                8,                          // Bits per component
                                                cvMat.step[0],              // Bytes per row
                                                colorSpace,                 // Colorspace
                                                kCGImageAlphaNoneSkipLast |
                                                kCGBitmapByteOrderDefault); // Bitmap info flags

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
CGContextRelease(contextRef);

return cvMat;
}

最佳答案

尝试使用下面的代码

    + (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
{
    cv::Mat cvMat = [self cvMatFromUIImage:image];
    cv::Mat grayMat;
    if ( cvMat.channels() == 1 ) {
        grayMat = cvMat;
    }
    else {
        grayMat = cv :: Mat( cvMat.rows,cvMat.cols, CV_8UC1 );
        cv::cvtColor( cvMat, grayMat, cv::COLOR_BGR2GRAY );
    }
    return grayMat;
}


+ (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
    CGFloat cols,rows;
    if  (image.imageOrientation == UIImageOrientationLeft
         || image.imageOrientation == UIImageOrientationRight) {
        cols = image.size.height;
        rows = image.size.width;
    }
    else{
        cols = image.size.width;
        rows = image.size.height;

    }

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                    cols,                       // Width of bitmap
                                                    rows,                       // Height of bitmap
                                                    8,                          // Bits per component
                                                    cvMat.step[0],              // Bytes per row
                                                    colorSpace,                 // Colorspace
                                                    kCGImageAlphaNoneSkipLast |
                                                    kCGBitmapByteOrderDefault);

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
    CGContextRelease(contextRef);


    cv::Mat cvMatTest;
    cv::transpose(cvMat, cvMatTest);

    if  (image.imageOrientation == UIImageOrientationLeft
         || image.imageOrientation == UIImageOrientationRight) {

    }
    else{
        return cvMat;

    }
    cvMat.release();

    cv::flip(cvMatTest, cvMatTest, 1);


    return cvMatTest;
}

关于ios - 从 UIImage 创建 cv::Mat 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123323/

相关文章:

python - 更改像素值

java - 如何在android opencv中检测轮廓宽度和高度

ios - 购买后收据中不包含免费试用版的 StoreKit 订阅(tx id 减少 1)

ios - 在 iPhone 6S 或 iPhone 6S Plus 模拟器上模拟压力触摸/3D 触摸

ios - 如何从 XIB 文件访问 ViewController 中的 IBoutlet

iOS15 : NSPersistentCloudKitContainer: how to un-share objects?

ios - 未调用 Objective-C UIKit UIAlertViewDelegate

ios - UINavigationBar 下方的 float 标题作为 subview - 接收触摸?

ios - UISeachBar 和委托(delegate)方法

python - 如何在 OpenCV 3.0 或更高版本中使用estimateRigidTransform,还有其他选择吗?