图像基础以及互相转换

版权声明:本文为博主原创文章,如有不实,不吝赐教。 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);

}

猜你喜欢

转载自blog.csdn.net/Webster_WXH/article/details/82318776