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

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

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

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

受付中

openCVのv4l2captureが使えない

sawadai
sawadai

総合スコア17

OpenCV

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

1回答

0評価

0クリップ

376閲覧

投稿2021/11/30 06:57

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

前提・実現したいこと

OpenCV,pythonで魚眼カメラの画像をキャリブレーションする機能を作成しています。
同じようなことをしているwebサイトを見つけ、このサイトを参考に作成しています。
OpenCV&Pythonで、簡単に魚眼レンズの歪み補正(Calibration)を行う方法

発生している問題

お聞きしたいことは大きく二つあります。

①v4l2captureを使用する方法
このサイトでは、カメラからの画像の取得に、v4l2captureというライブラリを使用しています。私の開発環境がmacOSなので、調べたところ使用できないみたいなのですが、もしこのライブラリを使用する方法がわかれば、教えていただきたいです。

②np.frombuffer関数の引数

python

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

以上のようなソースコードでおそらく動画から画像データを取得し、処理をおこなっているようなのですが、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/ツールのバージョンなど)

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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 編集

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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