python语言下使用pyqt中的QImage对海康工业相机获取到的图像进行显示

系列文章目录


 


前言

在工业视觉使用中,界面作为一个必不可少的软件直观体现,对于现场应用有着非常重要的作用,而在使用python进行工业相机的使用,对于界面的编辑必不可少是选择pyqt来编辑,而在pyqt中的图像显示就成了其中的重要实现,故对此在本文进行简略介绍;


一、QImage类粗略介绍

QImage 类在pyqt中的作用主要是I/O和直接逐像素点访问图像数据,QImage类提供了一个硬件无关的图像表示方法,该图像可以逐像素被访问和用于画图设备;故可以通过该 QImage 类对工业相机获取到的图像数据进行显示;

QImage类可以支持的像素格式:

    Format_A2BGR30_Premultiplied = 20
    Format_A2RGB30_Premultiplied = 22
    Format_Alpha8 = 23
    Format_ARGB32 = 5
    Format_ARGB32_Premultiplied = 6
    Format_ARGB4444_Premultiplied = 15
    Format_ARGB6666_Premultiplied = 10
    Format_ARGB8555_Premultiplied = 12
    Format_ARGB8565_Premultiplied = 8
    Format_BGR30 = 19
    Format_Grayscale8 = 24
    Format_Indexed8 = 3
    Format_Invalid = 0
    Format_Mono = 1
    Format_MonoLSB = 2
    Format_RGB16 = 7
    Format_RGB30 = 21
    Format_RGB32 = 4
    Format_RGB444 = 14
    Format_RGB555 = 11
    Format_RGB666 = 9
    Format_RGB888 = 13
    Format_RGBA8888 = 17
    Format_RGBA8888_Premultiplied = 18
    Format_RGBX8888 = 16
    InvertRgb = 0
    InvertRgba = 1

本文在调用过程中主要使用 QImage 类中的 Format_RGB888 格式和 Format_Indexed8 格式,主要是因为 QImage 类中默认使用RGB格式,且与 opencv 中的RGB格式通道相反;

二、使用海康工业相机API接口GetImagebuffer配合pyqt中的QImage类进行界面显示

1.海康工业相机API接口GetImagebuffer介绍

在海康提供的底层SDK中,有相关主动取流之 getimagebuffer 取流的接口,并且在安装目录下的工业相机SDK开发指南中,有对该接口的具体介绍,具体如下:

接口:MV_CC_GetImageBuffer()

对应于 C 语言接口如下:

MV_CAMCTRL_API int __stdcall MV_CC_GetImageBuffer  ( IN void *  handle,  
                                                     OUT MV_FRAME_OUT *  pstFrame,  
                                                     IN unsigned int  nMsec  
                                                   ) 

参数:

。handle :设备句柄

。pstFrame :图像数据和图像信息

。nMsec :等待超时时间,输入 INFINITE 时表示无限等待,直到收到一帧数据或者停止取流,

返回:

。调用成功,返回 MV_OK

。调用失败,返回错误码

注:

     1、调用该接口获取图像数据帧之前需要先调用 MV_CC_StartGrabbing() 启动图像采集,该接口为主动式获取帧数据,上层应用程序需要根据帧率,控制好调用该接口的频率。该接口支持设置超时时间,SDK内部等待直到有数据时返回,可以增加取流平稳性,适合用于对平稳性要求较高的场合。

    2、该接口与 MV_CC_FreeImageBuffer() 接口配套使用,当处理完取到的数据后,需要用 MV_CC_FreeImageBuffer() 接口将 pstFrame 内的数据指针权限进行释放;

    3、该接口与 MV_CC_GetOneFrameTimeout() 接口相比, 该接口有更高的效率,并且取流缓存的分配由 SDK 内部自动分配,而 MV_CC_GetOneFrameTimeout() 接口是需要我们自行分配的;

    4、该接口在调用了 MV_CCDisplay() 接口后会无法取流;

    5、该接口不支持 Cameralink 设备,仅支持 GigE 、USB 设备;

根据以上说明可知,MV_CC_GetImageBuffer() 接口需要在开始采集图像接口调用之后使用,即官方例程中的该接口调用,如下:

# 为线程定义一个函数
def work_thread(cam=0, pData=0, nDataSize=0):
    stOutFrame = MV_FRAME_OUT()  
    memset(byref(stOutFrame), 0, sizeof(stOutFrame))
    while True:
        ret = cam.MV_CC_GetImageBuffer(stOutFrame, 1000)
        if None != stOutFrame.pBufAddr and 0 == ret:
            print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]"  % (stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum))
            nRet = cam.MV_CC_FreeImageBuffer(stOutFrame)
        else:
            print ("no data[0x%x]" % ret)
        if g_bExit == True:
            break

在开启取流之后,通过该接口主动去抓取 SDK 底层的 buffer 中的图像数据和信息,通过该接口,可以将图像数据给到我们,但是官方例程中,并没有提供相关数据解析和显示的相关内容,这样就导致我们在此环节需要重新开发,本文第三部分将对图像数据的解析和显示做相关的代码实现;

并且在上面代码中可以看到该接口与 MV_CC_FreeImageBuffer()接口配套使用,在取到图像数据之后,在取下一张图像数据之前将 pstOutFrame 内的数据指针权限进行了释放;

2.在海康官方demo中修改添加QImage类进行显示

在海康官方demo中,使用 MV_CC_GetImageBuffer接口获取到图像数据之后,需要显示,但是使用pyqt在界面中显示是需要先定义界面,界面定义如下所示:


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

# 窗口设置
class initform(QWidget):
    def __init__(self):
        super().__init__()
        return self.initUI()

    def initUI(self):
        # 设置窗口左上边距,宽度高度
        self.setGeometry(300, 300, 1200, 900)
        self.setWindowTitle("工业相机")
        self.lable = QLabel("image", self)
        self.lable.setAlignment(Qt.AlignLeft)
        self.lable.setAlignment(Qt.AlignTop)
        self.lable.setGeometry(0, 0, 800, 600)
        self.lable.setScaledContents(True)
        self.lable.move(400,300)
        self.show()

    def SetPic(
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值