2011-03-09 130 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語句之前的