opencv笔记相机调用

更新时间:2024-01-18 03:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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 5. using namespace cv; 6. 7.

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;

164.

165. //当数据格式为12位时,位数转换为2-9 166. case GX_PIXEL_FORMAT_MONO10: 167. //将12位格式的图像转换为8位格式

168. DxRaw16toRaw8(m_pBufferRaw, m_pBufferRaw8, m_nImageWidth,

m_nImageHeight, DX_BIT_2_9); 169.

170. //将转换完成后的8位图转换为RGB图,以供显示

171. DxRaw8toRGB24(m_pBufferRaw8, m_pBufferRGB, m_nImageWidth,

m_nImageHeight, RAW2RGB_NEIGHBOUR, (DX_PIXEL_COLOR_FILTER)NONE, TRUE); 172. break; 173.

174. //当数据格式为8位时,将8位图转换为RGB图,以供显示 175. case GX_PIXEL_FORMAT_MONO8:

176. DxRaw8toRGB24(m_pBufferRaw, m_pBufferRGB, m_nImageWidth,

m_nImageHeight, RAW2RGB_NEIGHBOUR, (DX_PIXEL_COLOR_FILTER)NONE, TRUE); 177. break; 178. 179. default:

180. //m_objDrawImg.Leave(); 181. return; 182. } 183.

184. m_objDrawImg.Leave(); 185. } 186.

187. //图像回调处理函数

188. void __stdcall MERCamera::OnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM*

pFrame) 189. {

190. MERCamera *pDlg = (MERCamera*)(pFrame->pUserParam); 191. if (pFrame->status == 0) 192. {

193. //图像获取成功 194. //对图像进行处理...

195. // cout<<\

196. pDlg->DrawImage((BYTE*)pFrame->pImgBuf, pFrame->nImgSize); 197. } 198. return; 199. } 200.

201. void MERCamera::DrawImage(BYTE *pImageBuf, int nImageSize) 202. { 203.

204. cv::namedWindow(\

205. cv::Mat img(Size(2592,1944),CV_8U,pImageBuf ); 206. flip(img,img,-1);

207. cv::imshow(\208. cv::waitKey(30); 209. 210. } 211.

本文来源:https://www.bwwdw.com/article/imto.html

Top