我知道尝试使用openCV进入iPhone / iPad的图像处理我发现了一些很好的教程,但没有很多信息。
好吧,我正在尝试保存从较大图像的ROI裁剪的图像,XCode和Simulator没有报告任何错误,但在我尝试打开使用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);
提前感谢您提供的任何帮助
塞尔吉奥
答案 0 :(得分:1)
您应该使用cvSaveImage。 cvSave以XML / YAML格式保存图像。或者作为选项,您可以使用UIImagePNGRepresentation()
/ UIImageJPEGRepresentation()
获取原始图像数据并获取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;
}
答案 1 :(得分:1)
似乎源和目标中的颜色空间不同。尝试使用不同的颜色空间,即RGBA,BGRA组合。 或者在你的iplimage上尝试cvCvtColor到CV_RGBA2BGRA
PS:对不起,如果上面的函数和常量的拼写正确性有任何错误。我完全不记得它们
答案 2 :(得分:0)
这是改变颜色顺序的结果,红色和蓝色通道互换。原始图像位于BGRA色彩空间(OpenCV的默认值),您将图像保存为RGB。要解决此问题,请添加
cvCvtColor(垫,垫,CV_BGR2RGBA);
在saveImage语句之前。