假设在iOS开发中我们的图片类型为RGBA,而在OpenCV中我们使用图片的类型为RGB,如何利用OpenCv进行图片类型的转换呢?下面我们来Xcode敲核心代码:
一、RGBA图像转RGB图像
+(UIImage*)opencvImageProcess:(UIImage*)image{ //将iOS图片转为opencv可用图片 Mat mat_image_src; UIImageToMat(image, mat_image_src); //将RGBA类型转换为RGB类型 Mat mat_image_dst; cvtColor(mat_image_src, mat_image_dst, CV_RGBA2RGB, 4); //todo... return MatToUIImage(mat_image_dst); }
cvtColor函数将输入图像从一个颜色空间转换为另一个颜色空间。在一个转型的案例,从RGB颜色空间,对渠道的订单应该明确指定(RGB或BGR)。值得注意的是,在OpenCV的默认颜色格式通常被称为RGB其实BGR(字节是相反的)。因此,标准(24位)彩色图像中的第一个字节将是8位蓝色分量,第二个字节将是绿色的,第三个字节将是红色的。第四、第五和第六字节将是第二个像素(蓝色,然后是绿色,然后是红色),等等。
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
Python: cv2.cvtColor(src, code[, dst[, dstCn]]) → dst
C: void cvCvtColor(const CvArr* src, CvArr* dst, int code)
Python: cv.CvtColor(src, dst, code) → None
参数:
SRC–输入图像:8位无符号的16位无符号(cv_16uc…),或单精度浮点。
DST–输出图像的大小和深度为SRC。
代码–色彩空间转换的代码(见下面的描述)。
在目标图像的通道dstcn–数;如果该参数为0,通道的数量自动从SRC和代码。
二、RGB图像转RGBA图像
void CFaceComparisonDlg::RGBtoRGBA(unsigned char *RGBImage,const int wdth,const int heght, int& step, unsigned char *RGBAImage){ //void **RGBAImage = NULL; int i,j; int h = heght ,w = wdth; for(i = 0; i < h; i++){ for(j = 0; j < wdth; j++){ RGBAImage[i*wdth*4 + j*4 + 0] = RGBImage[i*step + j*3 + 0]; RGBAImage[i*wdth*4 + j*4 + 1] = RGBImage[i*step + j*3 + 1]; RGBAImage[i*wdth*4 + j*4 + 2] = RGBImage[i*step + j*3 + 2]; RGBAImage[i*wdth*4 + j*4 + 3] = 0xff; } } //CFile m_file; //if(m_file.Open(_T("./test.raw"), CFile::modeCreate|CFile::modeReadWrite)) //{ // m_file.Write(RGBAImage, wdth*h*4); // m_file.Close(); //} step = wdth*4; }
参考:
OpenCV 2.4 #cvtcolor
http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor
UIImageToMat源码是在文件夹modules/imgcodecs/src/ ios_conversions.mm里面的