【问题标题】:Error while creating cv::Mat from UIImage从 UIImage 创建 cv::Mat 时出错
【发布时间】:2018-04-17 19:29:15
【问题描述】:

我正在尝试使用 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;
}

【问题讨论】:

    标签: ios objective-c opencv uiimage


    【解决方案1】:

    试试下面的代码

        + (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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 2015-02-23
      • 2012-12-29
      • 2017-07-23
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2016-06-11
      • 2016-02-28
      相关资源
      最近更新 更多