gpt4 book ai didi

c++ - ios OpenCV 增加图像尺寸

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:05 25 4
gpt4 key购买 nike

下面是将 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 mb) 的图像转换为 cv::Mat 经过一些预处理后,我将其转换为 UIImage,它给出了大小为 2517 * 的图像1527(6 兆字节)

我不想在图像处理后增加图像尺寸。请指导我哪里做错了

//裁剪 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));

最佳答案

您的代码没有调整图像大小。这一定是预处理的意外副作用,您在这里没有详细说明。

 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 设置为与输入相同的大小。

关于c++ - ios OpenCV 增加图像尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32310147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com