您的位置:首页 > 移动开发 > IOS开发

iOS中如何将图片文件转为OpenCV中的cv::Mat

2012-05-28 10:59 801 查看
/**

* 提取图像元数据
*
*
@param filepath 图片路径,目前只支持jpg格式的图片
*
@param convertToGray 是否转化为灰度图片
*
*
@return cv::Mat
*/
cv::Mat ae_imageMatFromFile(constchar *filepath,
bool convertToGray){
FILE * pFile;

long lSize;

char * buffer;
size_t result;

pFile = fopen (filepath,"rb");

if (pFile == NULL)

return cv::Mat();

fseek (pFile ,
0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

// allocate memory to contain the whole file
buffer = (char*) malloc (sizeof(char)*lSize);

if (buffer == NULL) {
fclose (pFile);

return cv::Mat();
}

result = fread (buffer,1,lSize,pFile);

if (result != lSize) {
free (buffer);
fclose (pFile);

return cv::Mat();
}

fclose(pFile);

CFDataRef dataRef = CFDataCreate(NULL, (constunsigned
char *)buffer, lSize);

free(buffer);

if (dataRef == NULL) {

return cv::Mat();
}

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(dataRef);

CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider,NULL,
true, kCGRenderingIntentDefault);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

int imageWidth = CGImageGetWidth(imageRef);

int imageHeight = CGImageGetHeight(imageRef);

// Creating temporal IplImage for drawing
IplImage *iplImage = cvCreateImage(cvSize(imageWidth, imageHeight), IPL_DEPTH_8U,4);

// Creating CGContext for temporal IplImage
CGContextRef contextRef = CGBitmapContextCreate(iplImage->imageData, iplImage->width, iplImage->height,
iplImage->depth, iplImage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
// Drawing CGImage to CGContext
CGContextDrawImage(contextRef,
CGRectMake(0,0, imageWidth, imageHeight),
imageRef);

CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
CGImageRelease(imageRef);
CGDataProviderRelease(imgDataProvider);

// Creating result IplImage
IplImage *retIplImage;

if (convertToGray) {
retIplImage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U,1);
cvCvtColor(iplImage, retIplImage, CV_BGR2GRAY);
}

else{
retIplImage = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U,3);
cvCvtColor(iplImage, retIplImage, CV_RGBA2BGR);
}

cv::Mat imageMat = cv::Mat(retIplImage,true);

cvReleaseImage(&iplImage);
cvReleaseImage(&retIplImage);

return imageMat;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: