图像指针与矩阵格式转换——Mat转uchar*及uchar*转Mat代码实现

本篇文章实现RGB3通道图像Mat转uchar及uchar转Mat,编程环境:vs2013,opencv2.4.13 ,由于OpenCV读入和显示都是BGR类型,本文显示图像也用的BGR格式,若需换成RGB,程序中有对应替换程序。
先说一下要用到的Vec3b类型:
对于彩色图像中的一行,每列中有3个uchar元素,这可以被认为是一个小的包含uchar元素的vector,在OpenCV中用 Vec3b 来命名。

//Vec---是一个OpenCv的---向量类模板(向量模板类)
//Vec---向量类模板的类模板原型:
  template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
//实例化:
  typedef Vec<uchar, 3> Vec3b;//Vec3b---表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的一个像素点
//Vec3b使用:
//描述一种RGB颜色:
Vec3b color;
color[0]=0;//B分量
color[1]=0;//G分量
color[2]=255;//R分量

代码及实验结果如下:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/**将Mat类型的数据转换为uchar类型*/
uchar* matToUchar(Mat img)
{
	int img_width = img.cols;
	int img_height = img.rows;
	uchar *p1=(uchar*)malloc(sizeof(uchar)*img_height*img_width*3);/*[img_width * img_height * 3]*/
	for (int i = 0; i < img_width * img_height * 3; i++)
	{
		p1[i] = (uchar)img.at<Vec3b>(i / (img_width * 3), (i % (img_width * 3)) / 3)[i % 3];
	}
	return p1;
}

/**将uchar类型的数据转换为Mat类型*/
int ucharToMat(uchar *p2,Mat& src,int flag)
{
	int img_width = src.cols;
	int img_height = src.rows;
	//Mat img(Size(img_width, img_height), CV_8UC3);
	for (int i = 0; i < img_width * img_height * 3; i++)
	{
		src.at<Vec3b>(i / (img_width * 3), (i % (img_width * 3)) / 3)[i % 3] = p2[i];//BGR格式
		//src.at<Vec3b>(i / (img_width * 3), (i % (img_width * 3)) / 3)[i % 3] = p2[i];//换为RGB使用
	}
	flag = 1;
	return flag;
}

int main()
{
	Mat img = imread("01.jpg", 1);
	uchar* img_p = matToUchar(img);
	int img_height = img.rows;
	int img_width = img.cols;
	Mat view(img_height, img_width, CV_8UC3, Scalar(0, 0, 0));
	int flag_ucharTomat = ucharToMat(img_p, view, 0);
	if (flag_ucharTomat)
	{
		printf("图片格式转换成功!");
	}
	cvNamedWindow("Image view", 0);
	imshow("Image view", view);
	cvWaitKey(0);
	cvDestroyWindow("Image view");
}

实验结果如图:
实验结果
参考博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章