圖像指針與矩陣格式轉換——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");
}

實驗結果如圖:
實驗結果
參考博客

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