本篇文章实现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");
}
实验结果如图:
参考博客