bmp文件转yuv420文件

  1. /*  
  2.     bmp文件转yuv420文件程序  
  3.      vc2010 + opencv 2.4.4  
  4.     研究hevc时现有图像为bmp格式,HM中需要yuv420格式,网上没找到合适转换工具,就简单写了份转换代码  
  5.     zhuyh  
  6.     2013-06-08  
  7. */  
  8.   
  9. #include <opencv2/opencv.hpp>  
  10. #include <stdio.h>  
  11. #include <fstream>  
  12. #include <windows.h>  
  13. using namespace std;  
  14. using namespace cv;  
  15.   
  16. void bmp2yuv420(Mat bmp, char *file_name);  
  17. void yuv4202bmp(const char* yuvname, int nHeight, int nWidth);  
  18.   
  19. #define BOOT_CMD 1  
  20.   
  21. int main(int argc, char* argv[])  
  22. {  
  23. #ifdef BOOT_CMD  
  24.     if(argc == 3)  
  25.     {  
  26.         if(!strcmp(&argv[1][strlen(argv[1]-4)], ".bmp"))  
  27.         {  
  28.             Mat bmp = imread(argv[1]);  
  29.             int yuvRows = bmp.rows*3/2;  
  30.             int yuvCols = bmp.cols;  
  31.             int yuvSize = yuvRows*yuvCols;  
  32.             Mat yuvmat(yuvRows, yuvCols, CV_8UC1);  
  33.             const int max_path = 200;  
  34.             char filename[max_path] = "";  
  35.             strcat(filename, "d:\\bmp2yuv420\\");  
  36.             strcat(filename, argv[2]);            
  37.             bmp2yuv420(bmp, argv[2]);  
  38.             printf("convert bmp to yuv succ\n");              
  39.         }  
  40.     }  
  41.   
  42.     if(argc == 1)  
  43.     {  
  44.         char file_in[100];  
  45.         char file_out[100];  
  46.         printf("input bmp file name: ");  
  47.         scanf("%s",file_in);  
  48.         printf("input yuv file name: ");  
  49.         scanf("%s",file_out);  
  50.         Mat bmp = imread(file_in);  
  51.         bmp2yuv420(bmp, file_out);  
  52.         printf("convert bmp to yuv succ\n");  
  53.     }  
  54. #else  
  55.   
  56.     Mat bmp = imread("bmp.bmp");  
  57.     imshow("bmp file", bmp);  
  58.     bmp2yuv420(bmp, "yuv.yuv");  
  59. #endif  
  60.     //等待按键  
  61.     waitKey();  
  62.     system("pause");  
  63.    
  64.     return 1;  
  65. }  
  66.   
  67. void bmp2yuv420(Mat bmp, char *file_name)  
  68. {  
  69.     if(bmp.empty()) return;  
  70.     int nHeight = bmp.rows;  
  71.     int nWidth = bmp.cols;  
  72.       
  73.     //Mat rmat(nHeight, nWidth, CV_8UC1);  
  74.     //Mat gmat(nHeight, nWidth, CV_8UC1);  
  75.     //Mat bmat(nHeight, nWidth, CV_8UC1);  
  76.   
  77.     Mat ymat(nHeight, nWidth, CV_8UC1);  
  78.     Mat umat(nHeight/2, nWidth/2, CV_8UC1);  
  79.     Mat vmat(nHeight/2, nWidth/2, CV_8UC1);  
  80.     Mat yuvmat(nHeight, nWidth, CV_8UC3);  
  81.   
  82.     //unsigned char r,g,b;  
  83.     unsigned char y,u,v;  
  84.   
  85.     cvtColor(bmp, yuvmat, CV_RGB2YCrCb);  
  86.   
  87.     for(int i=0; i<nHeight; i++)  
  88.     {  
  89.         for(int j=0; j<nWidth; j++)  
  90.         {  
  91.             //b = bmp.at<Vec3b>(i,j)[0];  
  92.             //g = bmp.at<Vec3b>(i,j)[1];  
  93.             //r = bmp.at<Vec3b>(i,j)[2];  
  94.   
  95.             //rmat.at<unsigned char>(i,j) = r;  
  96.             //gmat.at<unsigned char>(i,j) = g;  
  97.             //bmat.at<unsigned char>(i,j) = b;  
  98.   
  99.             y = yuvmat.at<Vec3b>(i,j)[0];  
  100.             ymat.at<unsigned char>(Point(j,i)) = y;  
  101.             if((i%2==0) && (j%2==0))  
  102.             {  
  103.                 u = yuvmat.at<Vec3b>(i,j)[1];  
  104.                 v = yuvmat.at<Vec3b>(i,j)[2];  
  105.                 umat.at<unsigned char>(Point(j/2,i/2)) = u;  
  106.                 vmat.at<unsigned char>(Point(j/2,i/2)) = v;  
  107.             }  
  108.         }  
  109.     }  
  110.   
  111.     //显式  
  112.     //imshow("bmp2yuv420_rgb", bmp);  
  113.     //imshow("bmp2yuv420_r", rmat);  
  114.     //imshow("bmp2yuv420_g", gmat);  
  115.     //imshow("bmp2yuv420_b", gmat);  
  116.   
  117.     //保存  
  118.     //imwrite("bmp2yuv420_rgb.bmp",bmp);  
  119.     //imwrite("bmp2yuv420_r.bmp",rmat);  
  120.     //imwrite("bmp2yuv420_g.bmp",gmat);  
  121.     //imwrite("bmp2yuv420_b.bmp",bmat);  
  122.   
  123.     //显式  
  124.     //imshow("bmp2yuv420_y", ymat);  
  125.     //imshow("bmp2yuv420_u", umat);  
  126.     //imshow("bmp2yuv420_v", vmat);  
  127.   
  128.     //保存  
  129.     //imwrite("bmp2yuv420_y.bmp", ymat);  
  130.     //imwrite("bmp2yuv420_u.bmp", umat);  
  131.     //imwrite("bmp2yuv420_v.bmp", vmat);  
  132.   
  133.     int ySize = nWidth * nHeight;  
  134.     int uSize = ySize / 4;  
  135.     int vSize = ySize / 4;  
  136.   
  137.     //const char* yuvname = "d:\yuv.yuv";  
  138.     const char* yuvname = file_name;  
  139.     fstream bitstreamFile(yuvname, ios::binary | ios::out);  
  140.     if(bitstreamFile.fail()) printf("open fail\n");  
  141.   
  142.     bitstreamFile.write((char*)(ymat.data), ySize);  
  143.     if(bitstreamFile.fail() || bitstreamFile.eof()) printf("wirte fail\n");  
  144.     bitstreamFile.write((char*)(umat.data), uSize);  
  145.     if(bitstreamFile.fail() || bitstreamFile.eof()) printf("wirte fail\n");  
  146.     bitstreamFile.write((char*)(vmat.data), vSize);  
  147.     if(bitstreamFile.fail() || bitstreamFile.eof()) printf("wirte fail\n");  
  148.     printf("write yuv file succ\n");  
  149. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值