将图像保存到iPhone时出错
问题描述:
我知道尝试使用openCV进入iPhone/iPad的图像处理过程中我发现了一些很好的教程,但没有提供很多信息。将图像保存到iPhone时出错
嗯,我想保存图像从一个较大的图像时,Xcode的ROI裁剪和模拟器没有报告任何错误,但是当我尝试打开保存Finder中的图像报告了一个“损坏的文件后,或格式不识别“错误。
这对裁剪并保存图像的代码(它插入到脸部识别教程从nashruddin.com
cvSetImageROI(image, cvRect(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale));
/* create destination image
Note that cvGetSize will return the width and the height of ROI */
IplImage *img2 = cvCreateImage(cvGetSize(image),
image->depth,
image->nChannels);
cvCopy(image, img2, NULL);
cvResetImageROI(image);
CvAttrList attributes;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; //2
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"prueba.jpg"];
cvSave([path UTF8String], img2, NULL, NULL, attributes);
预先感谢任何帮助提供
塞尔吉奥
答
您应该使用cvSaveImage为cvSave将图像保存为XML/YAML格式,或者作为选项,您可以使用原始图像数据并使用UIImagePNGRepresentation()
/获取PNG/JPEG图像和保存使用[NSData writeToFile...]
要的IplImage转换成UIImage的使用:
UIImage* CreateUIImageFromIplImage(IplImage* ipl_image) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSData* data = [NSData dataWithBytes: ipl_image->imageData length: ipl_image->imageSize];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
CGImageRef imageRef = CGImageCreate(ipl_image->width, ipl_image->height,
ipl_image->depth, ipl_image->depth * ipl_image->nChannels, ipl_image->widthStep,
colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
provider, NULL, false, kCGRenderingIntentDefault);
UIImage* ret = [UIImage imageWithCGImage: imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return ret;
}
答
看来,色彩空间的源和目标不同。尝试使用不同的颜色空间,即RGBA,BGRA组合。 或在您的iplimage上尝试cvCvtColor到CV_RGBA2BGRA
PS:如果以上版本在函数和常量拼写的正确性方面存在任何错误,我很抱歉。我不确切记得它们
答
这是改变颜色顺序的结果,红色和蓝色通道互换。原始图像位于BGRA色彩空间(OpenCV的默认设置)中,并将图像保存为RGB。要解决此问题,请添加
cvCvtColor(mat,mat,CV_BGR2RGBA);在saveImage语句之前的
。