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;
}
* 提取图像元数据
*
*
@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;
}
相关文章推荐
- 【OpenCV3】cv::Mat中的数据按行列写入txt文件中
- OpenCV cv::mat 保存四通道图片 参数
- OpenCV读取一张图片的Mat数据类型到.txt文件
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV 用cv::Mat显示OpenNI获得的Kinect深度图片
- ImageMagick 的 Image 和 OpenCV 的 cv::Mat 如何转换
- OpenCV 用cv::Mat显示OpenNI获得的Kinect深度图片
- ios--OpenCV--cvCompareHist使用直方图模型(CvHistogram)比对两张图片
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV cv.Mat与.txt文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCv 2.4.9 (一) Mat基础结构&如何遍历图片
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- 如何访问opencv中cv::Mat
- 将PDF和图片文件如何转为Word或Excel分享几种转换器软件方法
- 【iOS开发-3】sandbox沙盒介绍以及如何取得沙盒里面各文件的路径,图片导入方式和图片路径获取
- 如何提取ipa中的图片; iphone ios 如何制作越狱ipa安装文件
- 如何在matlab里批量将JPG格式图片转成MAT格式文件?
- OpenCV读取一张图片的Mat数据类型到.txt文件