海康威视工业相机(MV-CA020-10UC),使用python语言调用并利用opencv进行实时显示

本文介绍了如何使用Python调用海康威视MV-CA020-10UC工业相机,并通过OpenCV进行实时显示。在解决图像格式问题后,实现了图像数据流的获取和显示。在与YOLO结合时遇到TensorFlow图形错误,通过注释sess.run中的K.learning_phase()解决了问题。注意,选择正确的Pixel Format(如RGB或BGR)以避免输出数据格式问题。
摘要由CSDN通过智能技术生成

可以参考博客: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjh_sjh_sjh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值