opencv笔记8----从大恒工业摄像头读取图像
2013-10-25 10:31 3280人阅读 评论(9) 收藏 举报
采用大恒MER系列工业摄像机,不能用OpenCV自带函数打开摄像头,需要用厂商提供的API
工业摄像头采集的图片格式为BYTE,opencv需要从内存中读取BYTE,转化成IplImage *(in C) 或者Mat( in c++)
[cpp] view plain copy print?
1. #include \2. #include \3. #include
4. #include
8. GX_DEV_HANDLE hDevice = NULL; 9. static int keycode; 10.
11. MERCamera::MERCamera() 12. {
13. GX_STATUS status = GX_STATUS_SUCCESS; 14. int64_t nValue = 0; 15.
16. GXInitLib();
17. status = GXOpenDeviceByIndex(1, &hDevice); 18. if(status != GX_STATUS_SUCCESS) 19. {
20. std::cout<<\21. return; 22. } 23. } 24.
25. MERCamera::~MERCamera() 26. {
27. GX_STATUS emStatus = GX_STATUS_SUCCESS;
28. if(m_bIsSnaping) 29. {
30. EndContinuesMode(); 31. } 32.
33. emStatus = GXCloseDevice(hDevice); 34. if(emStatus != GX_STATUS_SUCCESS) 35. {
36. std::cout<<\37. } 38.
39. //关闭设备库
40. emStatus = GXCloseLib();
41. if(emStatus != GX_STATUS_SUCCESS) 42. {
43. std::cout<<\44. } 45. } 46.
47. void MERCamera::InitCamera() 48. {
49. GX_STATUS status = GX_STATUS_SUCCESS; 50. int64_t nValue = 0; 51.
52. m_bIsSnaping = false;
53. status = GXGetEnum(hDevice, GX_ENUM_PIXEL_FORMAT, &m_nPixelFomat); 54. //获取宽度(需在停止采集状态下设置)
55. status = GXGetInt(hDevice, GX_INT_WIDTH, &nValue); 56. m_nImageWidth = (int)nValue; 57.
58. //获取高度(需在停止采集状态下设置)
59. status = GXGetInt(hDevice, GX_INT_HEIGHT, &nValue); 60. m_nImageHeight = (int)nValue; 61.
62. //获取图象数据大小
63. status = GXGetInt(hDevice, GX_INT_PAYLOAD_SIZE, &nValue); 64. m_nPayLoadSize = (int)nValue;
65. //设置采集模式。一般相机的默认采集模式为连续模式。 66. int64_t nAcqMode = GX_ACQ_MODE_CONTINUOUS;
67. GX_ENUM_ACQUISITION_MODE, nAcqMode); 68. 69. 70. do 71. { 72. m_pBufferRaw8 = new BYTE[m_nImageWidth * m_nImageHeight]; 73. if (m_pBufferRaw8 == NULL) 74. { 75. status = GX_STATUS_ERROR; 76. break; 77. } 78. 79. //为存储RGB图像数据开辟空间 80. m_pBufferRGB = new BYTE[m_nImageWidth * m_nImageHeight * 3]; 81. if (m_pBufferRGB == NULL) 82. { 83. status = GX_STATUS_ERROR; 84. break; 85. } 86. 87. //为存储原始图像数据开辟空间 88. m_pBufferRaw = new BYTE[m_nPayLoadSize]; 89. if (m_pBufferRaw == NULL) 90. { 91. status = GX_STATUS_ERROR; 92. break; 93. } 94. 95. } while (0); 96. if (status != GX_STATUS_SUCCESS) 97. { 98. if (m_pBufferRaw8 != NULL) 99. { 100. delete[]m_pBufferRaw8; 101. m_pBufferRaw8 = NULL; 102. } 103. if (m_pBufferRaw != NULL) 104. { 105. delete[]m_pBufferRaw; 106. m_pBufferRaw = NULL; 107. } 108. if (m_pBufferRGB != NULL) 109. { 110. delete[]m_pBufferRGB; 111. m_pBufferRGB = NULL; 112. } 113. } 114. 115. } 116. 117. void MERCamera::StartContinuesMode() 118. { 119. GX_STATUS status = GX_STATUS_SUCCESS; 120. InitCamera(); 121. //注册图像处理回调函数 122. status = GXRegisterCaptureCallback(hDevice, NULL,OnFrameCallbackFun); 123. if(!m_bIsSnaping) 124. { 125. //发送开采命令 126. status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_START); 127. m_bIsSnaping = true; 128. } 129. while(1) 130. { 131. if(keycode == 'q') EndContinuesMode(); 132. } 133. } 134. 135. void MERCamera::EndContinuesMode() 136. { 137. GX_STATUS status = GX_STATUS_SUCCESS; 138. if(m_bIsSnaping) 139. { 140. //发送停采命令 141. status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_STOP); 142. //注销采集回调 143. status = GXUnregisterCaptureCallback(hDevice); 144. m_bIsSnaping = false; 145. } 146. } 147. //fuction:ProcessImage(BYTE* pImageBuf) 148. //功能:raw格式图像转换为RGB图 149. void MERCamera::ProcessImage(BYTE *pImageBuf) 150. { 151. //m_objDrawImg.Enter(); 152. memcpy(m_pBufferRaw, pImageBuf, m_nPayLoadSize); 153. 154. switch(m_nPixelFomat) 155. { 156. //当数据格式为12位时,位数转换为4-11 157. case GX_PIXEL_FORMAT_MONO12: 158. //将12位格式的图像转换为8位格式 159. DxRaw16toRaw8(m_pBufferRaw, m_pBufferRaw8, m_nImageWidth, m_nImageHeight, DX_BIT_4_11); 160. 161. //将转换完成后的8位图转换为RGB图,以供显示 162. DxRaw8toRGB24(m_pBufferRaw8, m_pBufferRGB, m_nImageWidth, m_nImageHeight, RAW2RGB_NEIGHBOUR, (DX_PIXEL_COLOR_FILTER)NONE, TRUE); 163. break;