Opencv C++ 圖片一維buffer轉換成Mat格式

Opencv C++ 圖片一維buffer轉換成Mat格式

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

//************************************
// Method:    TransBufferToMat
// FullName:  圖片buffer數據轉換成 Mat數據格式;
// Access:    public 
// Returns:   cv::Mat
// Qualifier:
// Parameter: unsigned char * pBuffer  圖片數據內容
// Parameter: int nWidth	圖片的寬度
// Parameter: int nHeight  圖片的高度
// Parameter: int nBandNum 每個像素包含數據個數 (1, 3, 4 ) 1:Gray 3:RGB 4:RGBA
// Parameter: int nBPB  每個像素數據 所佔位數(1, 2) 1:8位  2:16位;
//************************************
cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1)
{
	cv::Mat mDst;
	if (nBandNum == 4)
	{
		if (nBPB == 1)
		{
			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC4);
		}
		else if (nBPB == 2)
		{
			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC4);
		}
	}
	else if (nBandNum == 3)
	{
		if (nBPB == 1)
		{
			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC3);
		}
		else if (nBPB == 2)
		{
			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC3);
		}
	}
	else if (nBandNum == 1)
	{
		if (nBPB == 1)
		{
			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC1);
		}
		else if (nBPB == 2)
		{
			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC1);
		}
	}

	for (int j = 0; j < nHeight; ++j)
	{
		unsigned char* data = mDst.ptr<unsigned char>(j);
		unsigned char* pSubBuffer = pBuffer + (nHeight - 1 - j) * nWidth* nBandNum*nBPB;
		memcpy(data, pSubBuffer, nWidth*nBandNum*nBPB);
	}
	if (nBandNum == 1)
	{
		cv::cvtColor(mDst, mDst, COLOR_GRAY2BGR);
	}
	else if (nBandNum == 3)
	{
		cv::cvtColor(mDst, mDst, COLOR_RGB2BGR);
	}
	else if (nBandNum == 4)
	{
		cv::cvtColor(mDst, mDst, COLOR_RGBA2BGR);
	}

	return mDst;
}

//灰度圖片測試;
void grayImageTest()
{
	//設置圖片長寬 單位像素所佔位數;
	int width = 300;
	int height = 200;
	int nBandNum = 1;

	//模擬灰度圖片數據;
	unsigned char* pBuffer = new unsigned char[width * height * nBandNum];

	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			if (j < 100)
			{
				pBuffer[i * width + j] = 255;
			}
			else if (j>=100 && j <200)
			{
				pBuffer[i * width + j] = 128;
			}
			else
			{
				pBuffer[i * width + j] = 0;
			}
		}
	}

	// 灰度圖片buffer數據轉換成Mat格式;
	Mat  grayImage = TransBufferToMat(pBuffer, width, height, 1);

	//顯示圖片數據
	cout << "高度" << grayImage.cols << endl;
	cout << "寬度" << grayImage.rows << endl;
	imshow("灰度圖片", grayImage);
	waitKey(0);

	delete pBuffer;
}

//彩色圖片測試;
void colorImageTest()
{
	//設置圖片長寬 單位像素所佔位數;
	int width = 300;
	int height = 200;
	int nBandNum = 3;

	//模擬彩色圖片數據;
	unsigned char* pBuffer = new unsigned char[width * height * nBandNum];

	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			if (j < 100)
			{
				pBuffer[i * width * nBandNum + j * nBandNum] = 255;
				pBuffer[i * width * nBandNum + j * nBandNum + 1] = 0;
				pBuffer[i * width * nBandNum + j * nBandNum + 2] = 0;
			}
			else if (100 <= j &&  j <200)
			{
				pBuffer[i * width * nBandNum + j * nBandNum] = 0;
				pBuffer[i * width * nBandNum + j * nBandNum + 1] = 255;
				pBuffer[i * width * nBandNum + j * nBandNum + 2] = 0;
			}
			else if (j >= 200)
			{
				pBuffer[i * width * nBandNum + j * nBandNum] = 0;
				pBuffer[i * width * nBandNum + j * nBandNum + 1] = 0;
				pBuffer[i * width * nBandNum + j * nBandNum + 2] = 255;
			}
		}
	}

	// 彩色圖片buffer轉換成Mat格式;
	Mat  colorImage = TransBufferToMat(pBuffer, width, height, 3);

	//顯示圖片數據;
	cout << "寬度" << colorImage.cols << endl;
	cout << "高度" << colorImage.rows << endl;
	imshow("彩色圖片", colorImage);
	waitKey(0);

	delete pBuffer;
}

int main()
{

	//灰度圖片測試;
	//grayImageTest();

	//彩色圖片測試;
	colorImageTest();
	
	return 0;
}

在這裏插入圖片描述

在這裏插入圖片描述

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