读取yuv并转化为RGB数据在Opencv中打开显示

/**

* Opencv中一般是读取 demo.avi 格式视频,下面程序是直接读取 demo.yuv  然后使用 Mat 保存

* 再使用 cv::cvtColor() 将每帧的 yuv 数据转化为 rgb 然后显示

*/

  1. #include <opencv/cv.h>  
  2. #include <fstream>  
  3. #include <iostream>  
  4. #include <opencv2/core/core.hpp>  
  5. #include <opencv2/highgui/highgui.hpp>  
  6. #include <opencv2/imgproc/imgproc.hpp>  
  7.   
  8.   
  9.   
  10. using namespace std;  
  11. using namespace cv;  
  12.   
  13. const int width = 1280;  
  14. const int height = 720;  
  15. const int framesize = width * height * 3 / 2;   //一副图所含的像素个数  
  16.   
  17. typedef struct planet  
  18. {  
  19.     char name[framesize];  
  20.     double population;  
  21.     double g;  
  22. } PLANET;  
  23.   
  24. int main()  
  25. {  
  26.   
  27. /////////////////////////////////////////////////////////////  
  28. // 计算视频的帧数,怎样替换成c语言形式的?  
  29.     PLANET pl;  
  30.     ifstream fin;  
  31.     fin.open("demo.yuv", ios_base::in|ios_base::binary);  
  32.     if(fin.fail())  
  33.     {  
  34.         cout << "the file is error" << endl;  
  35.         return -1;  
  36.     }  
  37.   
  38.     fin.seekg(0, ios::end);   //设置文件指针到文件流的尾部  
  39.     streampos ps = fin.tellg();  //指出当前的文件指针  
  40.     unsigned long NumberPixe = ps;  
  41.     cout << "file size: " << ps << endl;  //输出指针的位置  
  42.     unsigned FrameCount = ps / framesize; //帧大小  
  43.     cout << "frameNuber: " << FrameCount; //输出帧数  
  44.     fin.close();  
  45.   
  46. /////////////////////////////////////////////////////////////////  
  47.   
  48.   
  49.   
  50.     FILE* fileIn = fopen("demo.yuv""rb+");  
  51.     unsigned char* pYuvBuf = new unsigned char[framesize]; //一帧数据大小  
  52.   
  53.     //存储到图像  
  54.     namedWindow("yuv",  1);  
  55.   
  56.     for(int i = 0; i < FrameCount; ++i)  
  57.     {  
  58.         fread(pYuvBuf, framesize*sizeof(unsigned char), 1, fileIn);  
  59.         cv::Mat yuvImg;  
  60.         yuvImg.create(height*3/2, width, CV_8UC1);  
  61.         memcpy(yuvImg.data, pYuvBuf, framesize*sizeof(unsigned char));  
  62.         cv::Mat rgbImg;   
  63.         cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_I420);  
  64.   
  65.         cv::imshow("yuv", yuvImg); //只显示y分量  
  66.         cv::imshow("rgbImg", rgbImg);  
  67.   
  68.         printf("第 %d 帧\n", i);  
  69.         int c = waitKey(30);  
  70.         if((char)c == 27)  
  71.         {  
  72.             break;  
  73.         }  
  74.     }  
  75.     fclose(fileIn);  
  76.     cvDestroyWindow("yuv");  
  77.   
  78.     cin.get();  
  79.     cin.get();  
  80.   
  81.     return 0;  
  82. }  



猜你喜欢

转载自blog.csdn.net/edmond999/article/details/78874811