可以参考博客:https://blog.csdn.net/youandme520/article/details/108734661
装好海康威视相机的驱动后,在C:\Program Files (x86) \MVS\Development\Samples\ Python\ GrabImage中有GrabImage.py文件,
该文件会获取图像数据流
data_buf = (c_ubyte * nPayloadSize)()
并进行输出
print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
不过以上方法获取的图像格式不能使用opencv进行输出实时显示,需要对data_buf进行修改,整体代码如下:
# -- coding: utf-8 --
# 该示例程序说明了如何通过主动取图的方式获取相机图像。
# 创建句柄,打开相机,开始取流,创建取流线程(用户分配采集buffer, MV_CC_GetOneFrameTimeout() 取图(拷贝)),停止取流,关闭相机,销毁句柄。
import sys
import threading
import msvcrt
import cv2
import numpy as np
from ctypes import *
# sys.path.append("../MvImport") # 安装驱动后在C盘中的路径需要调用上一文件夹中的文件MvImport
from MvCameraControl_class import *
g_bExit = False
# 为线程定义一个函数
def work_thread(cam=0, pData=0, nDataSize=0):
stFrameInfo = MV_FRAME_OUT_INFO_EX()
memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
while True:
# MV_CC_GetOneFrameTimeout函数(图像数据接收指针,接收缓存大小,图像信息结构体,等待超时时间)
# 函数成功调用返回MV_OK,对应的二进制值为0;
ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)
# 获取图像的宽度与高度
nWidth = stFrameInfo.nWidth
nHeight = stFrameInfo.nHeight
if ret == 0:
data_ = np.frombuffer(data_buf, count=int(nWidth * nHeight * 3), dtype=np.uint8, offset=0)
data_r = data_[0:nWidth * nHeight * 3:3]
data_g = data_[1:nWidth * nHeight * 3:3]
data_b = data_[2:nWidth * nHeight * 3:3]
data_r_arr = data_r.reshape(nHeight, nWidth)
data_g_arr = data_g.reshape(nHeight, nWidth)
data_b_arr = data_b.reshape(nHeight, nWidth)
numArray = np.zeros([nHeight, nWidth, 3], "uint8")
# 调换RGB格式为BGR格式,为opencv读取格式,图像先高后宽;
numArray[:, :, 2] = data_r_arr
numArray[:, :, 1] = data_g_arr
numArray[:, :, 0] = data_b_arr
############################自己添加的内容#######################################
# 图像数据来自于numArray变量
cv2.namedWindow("raw_data", 0)
cv2.resizeWindow("raw_data", 640, 480)
cv2.imshow("raw_data", numArray)
cv2.waitKey(1)
# cv2.destroyAllWindows()
###############################################################################
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
if __name__ == "__main__":
deviceList = MV_CC_DEVICE_INFO_LIST()
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE # 工业相机的两种接口模式,表示查找GigE和USB3.0设备
# ch:枚举设备 | en:Enum device,根据编程引导第一步枚举所有设备,使用MV_CC_EnumDevices函数
ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
if ret != 0:
print("enum devices fail! ret[0x%x]" % ret)
sys.exit()
if deviceList.nDeviceNum == 0:
print("find no device!")
sys.exit()
# ####################第一个输出(发现设备数量)##################################
print("Find %d devices!" % deviceList.nDeviceNum)
# ####################################################################
for i in range(0, deviceList.nDeviceNum):
mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
# 判断相机设备型号
if