【问题标题】:ios OpenCV increases the image sizeios OpenCV 增加图片大小
【发布时间】:2015-11-25 10:09:18
【问题描述】:

以下是将UIImage 转换为cv::Mat 的代码

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

这个代码为cv::MatUIImage

+ (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat {

    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];    
    CGColorSpaceRef colorSpace;

    if (cvMat.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
    } else {
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                     // Width
                                    cvMat.rows,                                     // Height
                                    8,                                              // Bits per component
                                    8 * cvMat.elemSize(),                           // Bits per pixel
                                    cvMat.step[0],                                  // Bytes per row
                                    colorSpace,                                     // Colorspace
                                    kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                    provider,                                       // CGDataProviderRef
                                    NULL,                                           // Decode
                                    false,                                          // Should interpolate
                                    kCGRenderingIntentDefault);                     // Intent

    UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);    
    return image;
}

经过一些预处理后,我将 1080*1920 (1.5 mb) 的图像转换为 cv::Mat,然后将其转换为 UIImage,得到大小为 2517 * 1527(6 mb) 的图像

即使经过图像处理,我也不想增加图像大小。请指导我哪里做错了

//裁剪操作

 cv::Mat undistorted = cv::Mat( cvSize(maxWidth,maxHeight), CV_8UC4);
cv::Mat original = [MMOpenCVHelper cvMatFromUIImage:_adjustedImage];


cv::warpPerspective(original, undistorted, cv::getPerspectiveTransform(src, dst), cvSize(maxWidth, maxHeight));

【问题讨论】:

  • 我对这些东西了解不多,因为不必做这样的事情,但是,你知道图像大小在代码的什么点发生变化吗?您是否能够在再次将其更改为 UIImage 之前测试图像的大小?您是否使用较小的图像对此进行了测试,比如说一张 10x10 的图像,您可以在代码之前在纸上进行数学运算?
  • 你的图片在转换成 UIImage 之前的尺寸是多少?

标签: c++ ios objective-c opencv uiimage


【解决方案1】:

您的代码未调整图像大小。这一定是您在此处未详述的预处理的意外副作用。

 UIImage* image = self.testImage;
 NSLog(@"original UIImage: %.0f %.0f", image.size.width,image.size.height);

 cv::Mat matImage = [self cvMatFromUIImage:image];
 NSLog(@"cv matImage: %d %d", matImage.cols,matImage.rows);

 UIImage* newImage = [self UIImageFromCVMat:matImage];
 NSLog(@"new UIImage: %.0f %.0f", newImage.size.width,newImage.size.height);
original UIImage: 720 960
     cv matImage: 720 960
     new UIImage: 720 960

编辑
根据您的扩​​展问题,看起来warpPerspective 的输出大小为cvSize(maxWidth,maxHeight) - 这就是您将获得的大小。如果您想以输入大小结束,您可以在转换回UIImage 之前resize()。或者简单地将输出mat 设置为与输入相同的大小。

【讨论】:

    猜你喜欢
    • 2013-11-28
    • 2019-12-01
    • 2012-11-22
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多