iOS开发中利用OpenCV转换RGBA图片为RGB

假设在iOS开发中我们的图片类型为RGBA,而在OpenCV中我们使用图片的类型为RGB,如何利用OpenCv进行图片类型的转换呢?下面我们来Xcode敲核心代码:OpenCV Manager

一、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里面的

Leave a Reply