VỀ VIỆC SỬ DỤNG OPENCV TRONG CHƯƠNG TRÌNH MẪU PYTHON CHO CAMERA DÒNG CS/ EG (DÀNH CHO BAYER)

Chương trình mẫu Python dành cho camera dòng CS/ EG không được mã hóa tùy thuộc vào OpenCV để tương thích với OpenCV. Đây là mã chung mà không phụ thuộc vào thư viện cố định nào.

 

Dưới đây chúng tôi sẽ giới thiệu “GrabImage.py” làm ví dụ.

 

Python-OpenCV xử lý dữ liệu hình ảnh dưới dạng mảng numpy, vì vậy bạn cần phải khớp định dạng dữ liệu đó. Trong GrabImage.py, hình ảnh được lấy bằng cách sử dụng MV_CC_GetOneFrameTimeout() trong work_thread() và dữ liệu hình ảnh được truyền trong pData, tương ứng với một con trỏ trong ngôn ngữ C.

OpenCV không thể xử lý việc này như hiện tại, vì vậy chúng ta cần chuyển đổi pData này thành một mảng có nhiều mảng. Thực hiện theo các bước dưới đây để thực hiện chuyển đổi.

 

1)Thêm hai dòng lệnh import sau đây.

  • import numpy as np
  • import cv2

2) Thêm dòng sau để đặt đầu ra định dạng dữ liệu hình ảnh từ camera trước dòng ret = cam.MV_CC_StartGrabbing() trong __main__.

  • ret = cam.MV_CC_SetEnumValueByString(“PixelFormat”,”BayerRG8”)

Phần BayerRG8 khác nhau tùy thuộc vào camera, vì vậy sau khi mở MVS và kết nối camera, hãy chọn chuỗi thích hợp từ Cây tính năng → Kiểm soát hình ảnh Fromat → Định dạng pixel.

 

Hiển thị trong MVS Chuỗi tương ứng
 Bayer RG 8

 BayerRG8

 Bayer GR 8

 BayerGR8

 Bayer BG 8

 BayerBG8

 Bayer GB 8

 BayerGB8

 

PythonサンプルプログラムでOpenCVを使いたい件01

 

 

3)Bên trong Work_thread(), thêm mã để chuyển đổi pData thành mảng numpy. (Thêm hai dòng: cv2.imshow() và cv2.waitKey() để bạn có thể kiểm tra hình ảnh.)

def work_thread(cam=0, pData=0, nDataSize=0):

    stFrameInfo = MV_FRAME_OUT_INFO_EX()

    memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))

    while True :

        ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)

        if ret == 0:

            print (“get one frame: Width[%d], Height[%d], nFrameNum[%d]”  % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))

            image = np.asarray(pData._obj)

            image = image.reshape((stFrameInfo.nHeight, stFrameInfo.nWidth))

            image = cv2.cvtColor(image, cv2.COLOR_BayerBG2BGR)

            cv2.imshow(“show”, image)

            cv2.waitKey(1)

        else:

            print (“no data[0x%x]” % ret)

        if g_bExit == True:

            break

 

Vui lòng nhập chuỗi tương ứng với chuỗi bạn đã nhập trước đó vào phần cv2.COLOR_BayerBG2BGR.

 

  Chuỗi tương ứng
 BayerRG8

 cv2.COLOR_BayerBG2BGR

 BayerGR8

 cv2.COLOR_BayerGB2BGR

 BayerBG8

 cv2.COLOR_BayerRG2BGR

 BayerGB8

 cv2.COLOR_BayerGR2BGR

 

Ký hiệu của đối số thứ hai của cv2.cvtColor() không khớp với thứ tự trực quan của Bayer. Đây là đặc tả OpenCV. Thông số kỹ thuật được liệt kê dưới đây.

 

Thông số kỹ thuật được liệt kê dưới đây.

 

PythonサンプルプログラムでOpenCVを使いたい件02

 

 

Nếu màu của video không chính xác, bạn có thể đã mắc lỗi trong đối số thứ hai của cv2.cvtColor().