版权声明:本文为博主原创文章,如有不实,不吝赐教。 https://blog.csdn.net/Webster_WXH/article/details/82318776
主要用openCV转换图片的格式,
各种格式详见代码,以及opencv的宏定义
Mat BGR2NV12(Mat & BGR) {
if (BGR.empty()){
cout << "BGR is emptey!" << endl;
return BGR;
}
Mat I420, NV12;
cvtColor(BGR, I420, CV_BGR2YUV_I420);
NV12 = I420.clone();
uchar *uv = (uchar *)malloc(BGR.rows * BGR.cols/2);
for (size_t i = 0; i < BGR.rows/2 * BGR.cols / 2; i++){
uv[2 * i] = I420.data[BGR.rows * BGR.cols + i];
uv[2 * i + 1] = I420.data[BGR.rows * BGR.cols + BGR.rows / 2 * BGR.cols / 2 + i];
}
memcpy(NV12.data + BGR.rows * BGR.cols, uv, BGR.rows * BGR.cols / 2);
free(uv);
return NV12;
}
Mat BGR2NV21(Mat & BGR) {
if (BGR.empty()) {
cout << "BGR is emptey!" << endl;
return BGR;
}
Mat I420, NV21;
cvtColor(BGR, I420, CV_BGR2YUV_I420);
NV21 = I420.clone();
uchar *uv = (uchar *)malloc(BGR.rows * BGR.cols / 2);
for (size_t i = 0; i < BGR.rows / 2 * BGR.cols / 2; i++){
uv[2 * i + 1] = I420.data[BGR.rows * BGR.cols + i];
uv[2 * i] = I420.data[BGR.rows * BGR.cols + BGR.rows / 2 * BGR.cols / 2 + i];
}
memcpy(NV21.data + BGR.rows * BGR.cols, uv, BGR.rows * BGR.cols / 2);
free(uv);
return NV21;
}
int main() {
Mat src, BGR, RGB, I420, YUV2BGR_I420, YV12, YUV2BGR_YV12, NV12, YUV2BGR_NV12, NV21, YUV2BGR_NV21, tempMat;
BGR = imread("stone.jpg");
//src.create(720, 1280, CV_8UC3); // for bgr
src.create(720, 1280, CV_8UC3);
// FILE* fp = fopen("/home/webster/work/NFS/Sample.yuv", "r");
FILE* fp = fopen("/home/webster/work/NFS/Sample.bgr", "r");
char * data = (char *) malloc(1280*720*3);
fread(data, 1280*720*3, 1, fp);
src.data = (uchar *)data;
imshow("BGR", src); //正常 BGR
cvtColor(BGR, RGB, CV_BGR2RGB);
imshow("BGR2RGB", RGB); //调换B,R两个通道的 RGB
cvtColor(BGR, I420, CV_BGR2YUV_I420);
imshow("BGR2YUV_I420", I420); //BGR 转成 I420
cvtColor(I420, YUV2BGR_I420, CV_YUV2BGR_I420);
imshow("YUV2BGR_I420", YUV2BGR_I420); // I420 转成 BGR
YV12.create(I420.rows, I420.cols, I420.type());
memcpy(YV12.data, I420.data, BGR.rows * BGR.cols );
//memcpy(YV12.data + BGR.rows * BGR.cols, I420.data + BGR.rows * BGR.cols + (BGR.rows / 2) * (BGR.cols / 2), (BGR.rows / 2) * (BGR.cols / 2));
//memcpy(YV12.data + BGR.rows * BGR.cols + (BGR.rows / 2) * (BGR.cols / 2), I420.data + BGR.rows * BGR.cols, (BGR.rows / 2) * (BGR.cols / 2));
memset(YV12.data + BGR.rows * BGR.cols, 0, (BGR.rows / 2) * (BGR.cols / 2));
memset(YV12.data + BGR.rows * BGR.cols + (BGR.rows / 2) * (BGR.cols / 2), 0, (BGR.rows / 2) * (BGR.cols / 2));
imshow("BGR2YUV_YV12", YV12); // YV12
cvtColor(YV12, YUV2BGR_YV12, CV_YUV2BGR_I420);
imshow("YUV2BGR_YV12", YUV2BGR_YV12);
NV12 = BGR2NV12(BGR);
imshow("NV12", NV12);
NV21 = BGR2NV21(BGR);
imshow("NV21", NV21);
cvtColor(src, YUV2BGR_NV12, CV_YUV2BGR_NV12);
imshow("YUV2BGR_NV12", YUV2BGR_NV12);
cvtColor(src, YUV2BGR_NV21, CV_YUV2BGR_NV21);
imshow("YUV2BGR_NV21", YUV2BGR_NV21);
tempMat.create(NV12.rows, NV12.cols, NV12.type());
memcpy(tempMat.data, NV12.data, BGR.rows * BGR.cols);
memcpy(tempMat.data + BGR.rows * BGR.cols, NV12.data + BGR.rows * BGR.cols + BGR.rows / 2 * BGR.cols / 2, BGR.rows / 2 * BGR.cols / 2);
memcpy(tempMat.data + BGR.rows * BGR.cols + BGR.rows / 2 * BGR.cols / 2, NV12.data + BGR.rows * BGR.cols, BGR.rows / 2 * BGR.cols / 2);
Mat newBGR;
cvtColor(tempMat, newBGR, CV_YUV2BGR_NV12);
imshow("newBGR", newBGR);
waitKey(0);
}