说明:nBandNum表示图像buffer是几通道的,例如四通道的rgba,三通道的rgb;
nBPB表示图像的位深是8位还是16位的,默认为8位;
cv::Mat bufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB)
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);
return mDst;
1. cv::Mat转unsigned char*cv::Mat image = cv::imread("1.jpg");unsigned char *data = image.data;2. unsigned char*转cv::Mat说明:nBandNum表示图像buffer是几通道的,例如四通道的rgba,三通道的rgb;nBPB表示图像的位深是8位还是16位的,默认为8位;cv::Mat bufferToMat(unsigned char* pBuffer, int nWidth, i
unsigned char *ucImg = matImg.data; // Mat => unsigned char*
unsigned char*转cv::mat
Mat matImg = Mat(ysize, xsize, CV_8UC1, ucImg, ...
(1)前言:
参考其他博客编写的利用积分图优化的均值滤波函数中,输入参数和输出参数均为unsigned char *类型,无法直接传入Mat类型参数,因此需要进行Mat与unsigned char[ ]类型的相互转换。
(2)Mat转化为unsigned char[ ]类型:
//【1】原图像格式转换[mat转un...
unsigned char* 转换为 Mat类型
其中pBufAddr 为 unsigned char*类型
cv::Mat mmat = cv::Mat(stFrameInfo.nHeight, stFrameInfo.nWidth, CV_8UC1, stImageInfo.pBufAddr, 0);
BYTE* 转换为 Mat类型
其中m_pFrameBuffer 为BYTE* 类型
cv::Mat sMat = Mat(sFrameHead.iHeight, sFrameHead.iWidth,
cv::Mat mat = cv::imread("d:\\1.jpg");
std::string str;
std::vector<unsigned char> buff;
cv::imencode(".jpg", mat, buff);
str.resize(buff.size());
memcpy(&str[0], buff.data(), buff.size());
二、std::string转cv::Mat
把std::string当
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
using namespace cv;
//nBandNum表示图像buffer是几通道的,例如四通道的rgba,三通道的rgb;
//nBPB表示图像的位深是.
//CV_8UC4 rgba图像
//具体怎么选择看你的数据是什么了,如果这里设置的不对会导致你的图片很奇怪
Mat bgrImg(height,width,CV_8UC3,imageResult);
imshow("img", bgrImg);
此为QString无损转char*和unsigned char* 。
当QString内容包含汉字时,转换char*等会发生失败。此接口解决了该问题。使用后char*与unsigned char*的qDebug()输出与QString输出结果相同。
注意,该函数返回unsigned char*使用完毕后记得delete。
std::vector<uchar> buff;
cv::imencode(".bmp", load_image, buff);
std::string image_string(reinterpret_cast<char*>(&buff[0]), buff.size());
2 String 转Mat
std::vector&...
这个错误是在试图将一个 `cv::Mat` 指针转换成一个 `unsigned char` 类型。
这通常是因为你正在尝试将一个图像或矩阵类型的数据直接赋值给一个 `unsigned char` 变量或数组。但是 `unsigned char` 类型的变量或数组是用来存储单个字节的数据的,而一张图像或矩阵的数据类型通常是多个字节的。
所以为了正确使用图像或矩阵的数据,你应该使用像 `cv::imread` 或 `cv::Mat::at` 这样的函数来访问图像或矩阵的像素值。
例如,下面的代码段是错误的:
cv::Mat img = cv::imread("image.png");
unsigned char pixel = img.at<unsigned char>(0, 0);
应该改成这样:
cv::Mat img = cv::imread("image.png");
unsigned char pixel = img.at<cv::Vec3b>(0, 0)[0];