一、相机型号(海康): HIKVison MV-CE013-50GC 二、win10 x86_64 三、Python3.6.5、OpenCV3.4 四、需要结合海康SDK
拿到的童鞋,估计要慌了,官网并没有给出Python的开发文档,其实官网下载MVS(官网客户端)后,在安装目录下Develoment\Sample\下: 看到了熟悉的大Python。 里面的GrabImage.py。调用C接口,进行的。不懂也没关系。思路是拿到数据流,然后利用OpenCV进行操作。其实利用cv2.VideoCapture调用电脑自带摄像头是没问题的。然鹅,调用GIGE就不行了。 不废话,直接看代码:
# 找到SDK中的GrabImage.py # 为线程定义一个函数 def work_thread(cam=0, pData=0, nDataSize=0): stFrameInfo = MV_FRAME_OUT_INFO_EX() memset(byref(stFrameInfo), 0, sizeof(stFrameInfo)) while True: # print(pData) 此处获得是3686400字节的c_ubyte_Array 。why?因为我的分辨率1280*960,3通道 # np.set_printoptions(threshold=np.inf) temp = np.asarray(pData) # 将c_ubyte_Array转化成ndarray得到(3686400,) temp = temp.reshape((960, 1280, 3)) # 根据自己分辨率进行转化 # print(temp) # print(temp.shape) temp = cv2.cvtColor(temp, cv2.COLOR_BGR2RGB) # 这一步获取到的颜色不对,因为默认是BRG,要转化成RGB,颜色才正常 cv2.namedWindow("result", cv2.WINDOW_AUTOSIZE) cv2.imshow("result", temp) if cv2.waitKey(1) & 0xFF == ord('q'): break ret = cam.MV_CC_GetOneFrameTimeout(byref(pData), nDataSize, stFrameInfo, 1000) if ret == 0: print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum)) else: print ("no data[0x%x]" % ret) if g_bExit == True: break