以Bayer RG8彩色格式为例。
- 从缓存中获取一帧图像数据(海康相机默认的像素格式为Bayer RG8) ,得到:stOutFrame
python
MV_CC_GetImageBuffer(stOutFrame, outTime) # 获取一帧
st_frame_info = stOutFrame.stFrameInfo # 图像的帧信息
- 拷贝帧图像数据的字节流,得到:buf_frame_bytes
python
cdll.msvcrt.memcpy(byref(buf_frame_bytes), stOutFrame.pBufAddr,
st_frame_info.nFrameLen)
- 把字节流转换为以图像的宽和高为参数的二维数组numpy array,得到:image_array,现在的像素格式仍然是Bayer RG8.
python
image_array = np.frombuffer(buf_frame_bytes, dtype=np.uint8).reshape(
(stConvertParam.nHeight, stConvertParam.nWidth))
# opencv可以直接将这个保存为支持中文的文件
_, img_encoded = cv2.imencode(save_type, image_array) # 使用编码的方式保存,规避opencv不支持中文名的缺陷
# 将图像数据写入文件
with open(save_path, 'wb') as f:
f.write(img_encoded.tobytes())
- 把像素阵列转换到RGB和BGR格式,得到:rgb_image,格式为RGB;bgr_image,格式为BGR;
python
rgb_image = cv2.cvtColor(image_data, cv2.COLOR_BAYER_RG2RGB) # RGB格式,用于保存文件和Qt应用
bgr_image = cv2.cvtColor(image_data, cv2.COLOR_BAYER_RG2BGR) # BGR格式,用于OpenCv的处理
cv2.imwrite(file_path, rgb_image) # OpenCv保存文件(不支持中文文件名)
- 将RGB的像素阵列转换为Qt的QImage对象,得到:q_img
python
q_img = QImage(rgb_image.data, rgb_image.shape[1], rgb_image.shape[0], QImage.Format_RGB888)
q_img.save("test.jpg") # q_img可用于Qt的保存文件
- 将QImage对象转换为QPixmap,用于Qt的UI显示。得到:pix_map
python
pix_map = QPixmap.fromImage(q_img)
- 使用SetPixmap()函数在窗口部件上显示图像:
python
pixmap_item.setPixmap(pix_map) # 使用QPixmap数据
label.setPixmap(pix_map) # 使用QPixmap数据