質問を読んでいただきありがとうございます。
前提・実現したいこと
OpenCV,pythonで魚眼カメラの画像をキャリブレーションする機能を作成しています。
同じようなことをしているwebサイトを見つけ、このサイトを参考に作成しています。
OpenCV&Pythonで、簡単に魚眼レンズの歪み補正(Calibration)を行う方法
発生している問題
お聞きしたいことは大きく二つあります。
①v4l2captureを使用する方法
このサイトでは、カメラからの画像の取得に、v4l2captureというライブラリを使用しています。私の開発環境がmacOSなので、調べたところ使用できないみたいなのですが、もしこのライブラリを使用する方法がわかれば、教えていただきたいです。
②np.frombuffer関数の引数
python
1img = cv2.imdecode(np.frombuffer(image_data, dtype=np.uint8), cv2.IMREAD_COLOR) 2
以上のようなソースコードでおそらく動画から画像データを取得し、処理をおこなっているようなのですが、image_dataという変数に入るものがどういったものなのか理解できません。
ドキュメントで調べたところ、バッファーというパラメータが入っているようです。
該当のソースコード
# -*- coding: utf-8 -*- import numpy as np import cv2 import os import select import datetime import time from time import sleep SQUARE_SIZE = 23.0 # チェスボードの1つの四角の大きさ(mm) BOARD_SIZE = (10, 7) # チェスボードの四角の数 WIDTH = 1920 # 横サイズ HEIGHT = 1080 # 縦サイズ CAMERA_FILE = "camera.csv" # 出力ファイル DIST_FILE = "dist.csv" # 出力ファイル名 MAX_COUNT = 25 # 画像取得数 # メイン関数 def main(): # チェスボードを設定 pattern_points = np.zeros((np.prod(BOARD_SIZE), 3), np.float32) pattern_points[:, :2] = np.indices(BOARD_SIZE).T.reshape(-1, 2) pattern_points *= SQUARE_SIZE obj_points = [] img_points = [] # ビデオを開く video = cv2.VideoCapture(2) sizeX = video.get(cv2.CAP_PROP_FRAME_WIDTH) sizeY = video.get(cv2.CAP_PROP_FRAME_HEIGHT) print("解像度={0}x{1}".format(sizeX, sizeY)) # バッファを設定 # video.create_buffers(3) # video.queue_all_buffers() # 取り込みスタート while (True): ret, frame = video.read() cv2.imshow('frame', frame) # カメラが落ち着くまで待つ time.sleep(5) print("{0}枚の画像を撮影します。cキーで撮影。qキーで終了。".format(MAX_COUNT)) cnt = 0 while (cnt < MAX_COUNT): # カメラから画像を取得 #select.select((video,), (), ()) #image_data = video.read_and_queue() img = cv2.imdecode(np.frombuffer(image_data, dtype=np.uint8), cv2.IMREAD_COLOR) # 画面をリサイズして表示 resized_img = cv2.resize(img, (800, 600)) cv2.imshow('frame', resized_img) key = cv2.waitKey(1) if key == ord('c'): # グレースケールに変換 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # チェスボードが写っているか判定 found, corner = cv2.findChessboardCorners(img_gray, BOARD_SIZE) if found: cnt = cnt + 1 print("チェスボードを検出={0}/{1}".format(cnt, MAX_COUNT)) # チェスボードを計算 term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1) r = cv2.cornerSubPix(img_gray, corner, (5, 5), (-1, -1), term) # img2 = cv2.drawChessboardCorners(img_gray, BOARD_SIZE, r, found) # チェスボード情報を保存 obj_points.append(pattern_points) img_points.append(corner.reshape(-1, 2)) img_ok = img_gray elif key == ord('q'): # qで終了 break # カメラの歪みパラメータを計算 rms, k, d, r, t = cv2.calibrateCamera(obj_points, img_points, (img_ok.shape[1], img_ok.shape[0]), None, None) # 計算結果を表示 print("RMS = ", rms) print("K = \n", k) print("d = ", d.ravel()) # 値をファイルに保存 np.savetxt(CAMERA_FILE, k, delimiter=',', fmt="%0.14f") np.savetxt(DIST_FILE, d, delimiter=',', fmt="%0.14f") if cv2.waitKey(1) & 0xFF == ord('q'): break # カメラとウィンドウを閉じる video.release() cv2.destroyAllWindows() if __name__ == '__main__': main()
試したこと
v4l2captureというライブラリで作成しているものを、調べながら他のものに代用しています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。