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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

21249閲覧

USBカメラを認識しません Python , OpenCV , cv2.VideoCapture

Li3

総合スコア10

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/02 07:08

前提・実現したいこと

全体としては動画処理をしたく、
問題としてはcv2.VideoCapture(0)部分で

上手くUSBカメラが認識できません
(下記に記載した"試したこと"の通り)

初心者で申し訳ないですがご教授願います。

発生している問題・エラーメッセージ

[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1113) SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072875772 [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1125) SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072875772 [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1159) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072875772 cannot read image [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback

該当のソースコード

Python

1import cv2 2 3import numpy as np 4 5 6 7# 0 <= h <= 179 (色相) OpenCVではmax=179なのでR:0(180),G:60,B:120となる 8 9# 0 <= s <= 255 (彩度) 黒や白の値が抽出されるときはこの閾値を大きくする 10 11# 0 <= v <= 255 (明度) これが大きいと明るく,小さいと暗い 12 13# ここでは青色を抽出するので120±20を閾値とした 14 15LOW_COLOR = np.array([100, 75, 75]) 16 17HIGH_COLOR = np.array([140, 255, 255]) 18 19 20 21# 抽出する青色の塊のしきい値 22 23AREA_RATIO_THRESHOLD = 0.005 24 25 26 27def find_specific_color(frame,AREA_RATIO_THRESHOLD,LOW_COLOR,HIGH_COLOR): 28 29 """ 30 31 指定した範囲の色の物体の座標を取得する関数 32 33 frame: 画像 34 35 AREA_RATIO_THRESHOLD: area_ratio未満の塊は無視する 36 37 LOW_COLOR: 抽出する色の下限(h,s,v) 38 39 HIGH_COLOR: 抽出する色の上限(h,s,v) 40 41 """ 42 43 # 高さ,幅,チャンネル数 44 45 h,w,c = frame.shape 46 47 48 49 # hsv色空間に変換 50 51 hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) 52 53 54 55 # 色を抽出する 56 57 ex_img = cv2.inRange(hsv,LOW_COLOR,HIGH_COLOR) 58 59 60 61 # 輪郭抽出 62 63 _,contours,hierarchy = cv2.findContours(ex_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 64 65 66 67 # 面積を計算 68 69 areas = np.array(list(map(cv2.contourArea,contours))) 70 71 72 73 if len(areas) == 0 or np.max(areas) / (h*w) < AREA_RATIO_THRESHOLD: 74 75 # 見つからなかったらNoneを返す 76 77 print("the area is too small") 78 79 return None 80 81 else: 82 83 # 面積が最大の塊の重心を計算し返す 84 85 max_idx = np.argmax(areas) 86 87 max_area = areas[max_idx] 88 89 result = cv2.moments(contours[max_idx]) 90 91 x = int(result["m10"]/result["m00"]) 92 93 y = int(result["m01"]/result["m00"]) 94 95 return (x,y) 96 97def main(): 98 99 # webカメラを扱うオブジェクトを取得 100 101 cap = cv2.VideoCapture(0) 102 103 104 105 while True: 106 107 ret,frame = cap.read() 108 109 110 111 if ret is False: 112 113 print("cannot read image") 114 115 continue 116 117 118 119 # 位置を抽出 120 121 pos = find_specific_color( 122 123 frame, 124 125 AREA_RATIO_THRESHOLD, 126 127 LOW_COLOR, 128 129 HIGH_COLOR 130 131 ) 132 133 134 135 if pos is not None: 136 137 # 抽出した座標に丸を描く 138 139 cv2.circle(frame,pos,10,(0,0,255),-1) 140 141 142 143 # 画面に表示する 144 145 cv2.imshow('frame',frame) 146 147 148 149 # キーボード入力待ち 150 151 key = cv2.waitKey(1) & 0xFF 152 153 154 155 # qが押された場合は終了する 156 157 if key == ord('q'): 158 159 break 160 161 162 163 cv2.destroyAllWindows()

試したこと

・Video I/Oを有効化

・下記ライブラリをインストール
pip install opencv-contrib-python --user

・下記確認用コードでカメラのIDを確認
import cv2

cap_cam = cv2.VideoCapture(0)
print(type(cap_cam))

print(cap_cam.isOpened())

→この際はTrueを返しエラーとしてはterminating async callbackのみ
cv2.VideoCapture(-1) → false
cv2.VideoCapture(0) → true
cv2.VideoCapture(1) → false
cv2.VideoCapture(2) → false

PCにインストールされているその他デバイスとして
キャプチャーデバイス GC551がありますが影響とかあるのでしょうか・・・

補足情報(FW/ツールのバージョンなど)

Python 3.8.2
Opnecv-python 4.2.0.34

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

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

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

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

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

guest

回答1

0

ベストアンサー

MSMF(Microsoft Media Foundation)APIの問題のように見えます。

ココを

python

1cap = cv2.VideoCapture(0)

下記のように

python

1cap = cv2.VideoCapture(0+cv2.CAP_DSHOW)

あるいは

python

1cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

としてみてはいかがでしょうか。
参考URL:etting-error-videoiomsmf-async-readsample-call-is-failed-with-error-statu

投稿2020/05/02 07:24

編集2020/05/02 07:50
PINTO

総合スコア351

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

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

Li3

2020/05/02 07:39

回答ありがとうございます!無事エラーは吐かなくなりました! しかし今度は(-1)~(2)まで試したところ全てFalseになってしまいました。 何かほかに原因と思われる事はありますでしょうか...
Li3

2020/05/02 12:14

下記の2点で認識させることができました、ありがとうございます! ・cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) ・USBカメラを使用しているソフトウェアの立ち下げ(PCの再起動?) 恐れながらフォローさせていただきました。差し障りなければ今後とも宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問