質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

1回答

1965閲覧

openCVのv4l2captureが使えない

sawadai

総合スコア17

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2021/11/30 06:57

質問を読んでいただきありがとうございます。

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/11/30 07:36

ret, frame = video.read() で、ちゃんと画像が取得できるのなら、 img = cv2.imdecode(np.frombuffer(image_data, dtype=np.uint8), cv2.IMREAD_COLOR) は無くして、その代わりに同じところに ret, img = video.read() を追加して、retを調べてちゃんと画像が取得できてたら次に進めばいいと思います 参考 https://pystyle.info/opencv-videoio/#outline__2_1 の「Web カメラから映像を取得する」
sawadai

2021/11/30 07:39

ご回答いただきありがとうございます。あなたは私の救世主です。 ということは、このimdecode関数は必要ない処理ということでしょうか。
jbpb0

2021/11/30 07:51 編集

ret, frame = video.read() で、(OpenCVで)ちゃんと画像が取得できるのなら、要りません その行は、(OpenCVではなく)v4l2captureで取得した画像データを、「ret, img = video.read()」の「img」と同じ形式のデータに変換するためのものですので 前のコメントで紹介したWebページの「Web カメラから映像を取得する」のコードを動かして、カメラの画像がちゃんと表示されるのなら、大丈夫です
sawadai

2021/11/30 08:12 編集

ご回答ありがとうございます。理解することができました。解決済みにさせていただきます。 できれば、ベストアンサーにさせていただきたいので、回答の方に一つ目の修正依頼をコピーペーストしていただけないでしょうか。
guest

回答1

0

python

1 ret, frame = video.read()

で、ちゃんと画像が取得できるのなら、

python

1 img = cv2.imdecode(np.frombuffer(image_data, dtype=np.uint8), cv2.IMREAD_COLOR)

は無くして、その代わりに同じところに

python

1 ret, img = video.read()

を追加して、retを調べてちゃんと画像が取得できてたら次に進めばいいと思います

参考
OpenCV – VideoCapture、VideoWriter の使い方
の「Web カメラから映像を取得する」

投稿2021/11/30 22:27

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問