本篇文章實現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");
}
實驗結果如圖:
參考博客