这里先举一个例子,把Opencv中的图像数据存储到一个void *data数据中
struct IMAGE_DATA
void *data; //图像数据
int rows; //图像高
int cols; //图像宽
int channels; //图像通道数
};
bool OpencvMat2data(cv::Mat &opencvMat,IMAGE_DATA &image_data)
{
bool bStatus = true;
image_data.cols = opencvMat.cols;
image_data.rows = opencvMat.rows;
image_data.channels = opencvMat.channels();
int imageLength = image_data.cols * image_data.rows * image_data.channels;
if(imageLength == 0)
return false;
image_data.data= malloc( imageLength * sizeof(unsigned char) );
if(image_data.data != NULL){
memcpy(image_data.data, opencvMat.data, imageLength);
bStatus = true;
}
else
bStatus = false;
return bStatus;
}
在对Opencv应用过程中也会应用到相应的android系统中,对于android系统而言,其从摄像头获取的图像文件格式为YUV420sp格式,后续为了更方便的运算我们把YUV420sp格式转化为相应的BGR图像格式,对应的code如下:
//IMAGE_DATA image_data image_data中的void *data 存储了对应的YUV420sp数
int imageLength = grOcrMat.rows * grOcrMat.cols * 3 / 2;
cv::Mat yuvImg;
cv::Mat bgrImg;
yuvImg.create( grOcrMat.rows * 3 / 2, grOcrMat.cols, CV_8UC(grOcrMat.channels) );
memcpy(yuvImg.data, grOcrMat.data, imageLength*sizeof(unsigned char));
cv::cvtColor(yuvImg, bgrImg, CV_YUV2BGR_NV21);