ios OpenCV увеличивает размер изображения

Ниже приведен код для конвертации 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::Mat в UIImage

+ (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 МБ) изображения в cv::Mat после некоторой предварительной обработки я преобразую его в UIImage что дает мне изображение размером 2517 * 1527 (6 МБ)

Я не хочу увеличивать размер изображения даже после обработки изображения. Пожалуйста, направьте меня, где я делаю неправильно

// Crop Action

 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));

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) — так что это размер, который вы получите. Если вы хотите в конечном итоге с размером ввода, вы можете resize() перед преобразованием обратно в UIImage, Или просто установите выход mat к тому же размеру, что и вход.

1

Другие решения


По вопросам рекламы [email protected]