ios OpenCV增加图像大小
ios OpenCV increases the image size
下面是将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 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* 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
设置为与输入相同的大小。
相关文章:
- 数组索引的值没有增加
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 为什么我的代码在输出中增加了93天
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 有效地使用std::unordered_map来插入或增加键的值
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 增加 gil 读取图像错误
- 加载后图像大小增加
- ios OpenCV增加图像大小