在pyqt5中,使用Qimage显示相机的图像
前言:需要在pyqt5的软件界面上显示相机的图像,但是在CSDN上没有找到相关的方案。在翻阅资料后,写下查阅过程。
1、第一步,搞清相机返回的数据类型
根据打印的数据,相机返回的是c_ubyte_Array。查询c_types的官方文档:
得知,是c的unsigned char数组。也就是说,一个char值表示一个像素点的灰度值。(因为unsigned char长度为0-255,可以代表0-255的灰度值)
2、搞清楚图像显示在控件中的语法
因此,做一个小实验:在一个图像中,使用字符a进行填充:
# 例:使用unchar类型的a,填充整幅图像
string1 = "a"* 40000
STR = (c_char * 40000)(*bytes(string1, 'utf-8')) # 把一组100个的字符定义为STR,并转换为bytes类型
cast(STR, POINTER(c_char)) # 强制将STR转换为字符指针POINTER(c_char)
image = QImage(STR, 200, 200, QImage.Format_Indexed8)
self.label.setPixmap(QPixmap.fromImage(image))
结果,获取了一张灰度值为97的图像
证明了可行性。
或者使用最简单的方法:
image.fill((97) # 直接全图显示为97的灰度图
也可以。
当然,可以显示为彩色:
image = QImage(200, 200, QImage.Format_RGB888) # 创建对象
image.fill(QColor(235, 172, 75)) # 填充颜色
for i in range(0, 29): #使用setPixelColor,绘制直线
image.setPixelColor(i, i, QColor(170, 0, 0))
self.label.setPixmap(QPixmap.fromImage(image)) # 转化为QPixmap,并显示
实验完毕,在demo中进行验证:
im = BasicDemo.obj_cam_operation.buf_cache
width = BasicDemo.obj_cam_operation.st_frame_info.nWidth
height = BasicDemo.obj_cam_operation.st_frame_info.nHeight
format = BasicDemo.obj_cam_operation.st_frame_info.enPixelType
image = QImage(im, width, height, QImage.Format_Indexed8)
# 在主界面的label上显示相机图像
self.label.setPixmap(QPixmap.fromImage(image))
经测试,效果OK:
附:其中涉及到的与c的数据转换