前提・実現したいこと
全体としては動画処理をしたく、
問題としては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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/02 07:39
2020/05/02 07:44
2020/05/02 12:14