设为首页 加入收藏

TOP

15.3.6 远程摄像头--创建客户方工程(2)
2013-10-07 14:38:00 来源: 作者: 【 】 浏览:60
Tags:15.3.6 远程 摄像头 创建 客户 工程

15.3.6  远程摄像头--创建客户方工程(2)

(4)参考图15.13,将openCV目录下GDI+库中的PictureConvert.h PictureConvert.cpp加入到工程中,并在VideoClientDlg.h文件中添加如下代码:

  1. 01  #include "CameraDS.h"  
  2. 02  #include "Msg_Public.h"  
  3. 03  #include "PictureConvert.h"  
  4. 04  #pragma comment(lib, "strmiids.lib")  
  5. 05  #pragma comment(lib, "cxcore.lib")  
  6. 06  #pragma comment(lib, "cv.lib")  
  7. 07  #pragma comment(lib, "ml.lib")  
  8. 08  #pragma comment(lib, "cvaux.lib")  
  9. 09  #pragma comment(lib, "highgui.lib")  
  10. 10  #pragma comment(lib, "cvcam.lib")  
  11. 11  #pragma comment(lib, "cvcam.lib")  
  12. 12  //以上代码显示连接openCV库  
  13. 13  #include "TcpClient.h"  
  14. 14  typedef struct VideoDataDibStruct   
  15. 15  {//IplImage转为BMP的结构  
  16. 16   DWORD height;                  //图像高  
  17. 17   DWORD width;                   //图像宽  
  18. 18   DWORD lineBytes;               //1行图像字节数  
  19. 19   DWORD lineBytes24;             //24位色1行图像字节数  
  20. 20   DWORD totalSize;               //BMP图像总大小字节数  
  21. 21   BYTE pData[1024*225];          //指向BMP图像数据缓冲区  
  22. 22  }VIDEODATADIB;  

【代码解析】

第2行包含服务方和客户方公有消息定义头文件。第3行包含转换BMP数据到JPG数据实现头文件。第14~22行定义摄像头数据转为BMP数据的结构。

(5)为CVideoClientDlg类添加成员变量,代码如下:

  1. CTcpClient m_videoClient;           //客户方连接对象  
  2. CCameraDS m_CameraDS;               //摄像头设备对象  
  3. CPictureConvert m_PictureConvert;   //BMP与JPG互转类对象  

(6)为CVideoClientDlg类添加类成员函数IplImage2Bmp(),实现IplImage结构转为BMP图片数据。代码如下:
  1. bool IplImage2Bmp(IplImage *img, VIDEODATADIB *bmpData); 

在IplImage2Bmp()函数中添加如下代码:
  1. 01  Bool CVideoClientDlg::IplImage2Bmp(IplImage *img, VIDEODATADIB   
  2.     *bmpData);  
  3. 02  {  
  4. 03      DWORD height = img->height;             //图片高  
  5. 04      DWORD width = img->width;               //图片宽  
  6. 05      DWORD lineBytes = (width*8+31)/32*4;  
  7.                                     //计算8位色图1行字节数(4字节对齐)  
  8. 06      DWORD lineBytes24 = (width*24+31)/32*4;  
  9.                                     //计算24位色图1行字节数(4字节对齐)  
  10. 07      bmpData->heightheight = height;  
  11. 08      bmpData->widthwidth = width;  
  12. 09      bmpData->lineByteslineBytes = lineBytes;  
  13. 10      bmpData->lineBytes24lineBytes24 = lineBytes24;  
  14. 11      bmpData->totalSize = height*lineBytes24;  
  15.                                     //图像总字节数等于图像高×24位色每行字节数  
  16. 12      WORD bitCount;  
  17. 13      if(img->nChannels == 1)     //以下只处理8位和24位色图片  
  18. 14      {  
  19. 15          bitCount = 8;           //8位色图  
  20. 16      }  
  21. 17      else if(img->nChannels == 3)  
  22. 18      {  
  23. 19          bitCount = 24;          //24位色图  
  24. 20      }  
  25. 21      else  
  26. 22      {//其他格式的图片不进行转换  
  27. 23          return false;  
  28. 24      }  
  29. 25      if(bitCount==8)   
  30. 26      { //如果是8位色图,则转为8位色对应的BMP图数据,8位色图每像素8位也就是占       1字节大小  
  31. 27          for(int i=0; i<img->height; i++)  
  32. 28          {  
  33. 29              for(int j=0,n=0; j<img->width*3; j++,n++)  
  34. 30              {       *((bmpData->pData)+lineBytes24*(height-1-i)+j)  
  35.                         =(BYTE)  
  36. 31                      ((uchar*)(img->imageData+img->widthStep*i))[n];  
  37. 32                      j++;        //转换第i行j列的第1个字节  
  38. 33  *((bmpData->pData)+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)  
  39.      (img->ImageData+img->widthStep*i))[n];  
  40. 34                      j++ ;       //转换第i行j列的第2个字节  
  41. 35*((bmpData->pData)+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->I  
  42.    mageData+img->widthStep*i))[n];  //转换第i行j列的第3个字节  
  43. 36              }  
  44. 37          }  
  45. 38      }  
  46. 39      else  
  47. 40      { //如果是24位色图,则转为24位色对应BMP图数据  
  48.             //24位色图每像素占24位也就是3个字节  
  49. 41          for(int i=0; i<img->height; i++)  
  50. 42          {  
  51. 43              for(int j=0,n=0; j<img->width*3; j++,n++)  
  52. 44              {  
  53. 45*((bmpData->pData)+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->i  
  54.    mageData+img->widthStep*i))[3*n];    //转换第i行j列的像素第1个字节  
  55. 46                  j++;  
  56. 47*((bmpData->pData)+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->I   
  57.    mageData+img->widthStep*i))[3*n+1];  //转换第i行j列的像素第2个字节  
  58. 48                  j++;  
  59. 49*((bmpData->pData)+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->i  
  60.    mageData+img->widthStep*i))[3*n+2]   //转换第i行j列的像素第3个字节  
  61. 50              }  
  62. 51          }  
  63. 52      }  
  64. 53      return true;  
  65. 54  }  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇15.3.6 远程摄像头--创建客户方工.. 下一篇15.3.6 远程摄像头--创建客户方工..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: