2011-03-09 89 views
2

我知道尝试使用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); 

预先感谢任何帮助提供

塞尔吉奥

回答

1

您应该使用cvSaveImagecvSave将图像保存为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; 
} 
1

看来,色彩空间的源和目标不同。尝试使用不同的颜色空间,即RGBA,BGRA组合。 或在您的iplimage上尝试cvCvtColor到CV_RGBA2BGRA

PS:如果以上版本在函数和常量拼写的正确性方面存在任何错误,我很抱歉。我不确切记得它们

0

这是改变颜色顺序的结果,红色和蓝色通道互换。原始图像位于BGRA色彩空间(OpenCV的默认设置)中,并将图像保存为RGB。要解决此问题,请添加

cvCvtColor(mat,mat,CV_BGR2RGBA);在saveImage语句之前的