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

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

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

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

Python

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

Q&A

解決済

1回答

3956閲覧

カメラを用いた画像処理でのエラー

uriuri

総合スコア47

OpenCV

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

Python

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

0グッド

0クリップ

投稿2018/09/13 07:17

編集2018/09/13 07:30

カメラを用いて映った物体に対して処理を行おうとおもっています

以前動いたプログラムを一部書き換え試しました
以前動いたプログラムもエラーをはくようになってしまいました

python

1import cv2 2import math 3import numpy as np 4 5# cv2.cv.CV_FOURCC 6def cv_fourcc(c1, c2, c3, c4): 7 return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \ 8 ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24) 9 10 11if __name__ == '__main__': 12 # 13 ESC_KEY = 27 # 14 INTERVAL= 33 # 33 15 FRAME_RATE = 30 # fps 16 17 ORG_WINDOW_NAME = "ORG" 18 DST_WINDOW_NAME = "DST" 19 20 FILE_NAME1 = "1.avi" 21 FILE_NAME2 = "2.avi" 22 FILE_NAME3 = "3.avi" 23 FILE_NAME4 = "4.avi" 24 FILE_NAME5 = "5.avi" 25 26 DEVICE_ID = 1 27 28 # 29 cap = cv2.VideoCapture(DEVICE_ID) 30 31 # 32 end_flag, c_frame = cap.read() 33 height, width, channels = c_frame.shape 34 image_size = height * width 35 rec = cv2.VideoWriter(FILE_NAME1, \ 36 cv_fourcc('X', 'V', 'I', 'D'), \ 37 FRAME_RATE, \ 38 (width, height), \ 39 True) 40 rec2 = cv2.VideoWriter(FILE_NAME2, \ 41 cv_fourcc('X', 'V', 'I', 'D'), \ 42 FRAME_RATE, \ 43 (width, height), \ 44 True) 45 rec3 = cv2.VideoWriter(FILE_NAME3, \ 46 cv_fourcc('X', 'V', 'I', 'D'), \ 47 FRAME_RATE, \ 48 (width, height), \ 49 True) 50 rec4 = cv2.VideoWriter(FILE_NAME4, \ 51 cv_fourcc('X', 'V', 'I', 'D'), \ 52 FRAME_RATE, \ 53 (width, height), \ 54 True) 55 rec5 = cv2.VideoWriter(FILE_NAME5, \ 56 cv_fourcc('X', 'V', 'I', 'D'), \ 57 FRAME_RATE, \ 58 (width, height), \ 59 True) 60 61 # 62 cv2.namedWindow(ORG_WINDOW_NAME) 63 cv2.namedWindow(DST_WINDOW_NAME) 64 65 # 66 while end_flag == True: 67 gauss = cv2.GaussianBlur(c_frame, (11, 11), 0) 68 gray = cv2.cvtColor(gauss, cv2.COLOR_BGR2GRAY) 69 ret,th1 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) 70 edges = cv2.Canny(th1, 50, 150) 71 img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) 72 for i in range(0, len(contours)): 73#for cnt in contours: 74 cnt = contours[i] 75 area = cv2.contourArea(cnt) 76 print(area) 77 78 if 500 < area < 5000: 79 rect = cv2.minAreaRect(cnt) 80 box = cv2.boxPoints(rect) 81 82 (cx, cy), (width, height), angle = rect 83 diag = np.linalg.norm([width, height]) 84 print(width, height, diag) 85 # 161.91236877441406 16.144147872924805 162.715237986 86 87 # 長方形の幅、高さ、対角線の長さは cv2.minAreaRect() の返り値 88 # を見ればわかるので計算しなくてもよい。 89 #x1, x2, x3, x4 = box 90 #A = np.linalg.norm(x1 - x2) 91 #B = np.linalg.norm(x1 - x3) 92 #C = np.linalg.norm(x1 - x4) 93 #print("頂点",x1, x2, x3, x4) 94 #print("Aの長さ", A) # Aの長さ 16.1441 95 #print("Bの長さ",B) # Bの長さ 162.715 96 #print("Cの長さ",C) # Cの長さ 161.912 97 A = width 98 B = height 99 C = diag 100 101 if A < B: 102 min = A 103 else: 104 min = B 105 if C < min: 106 min = C 107 print("最小", min) 108 if 5 < min < 25: 109 # drawContours() の contours 引数は int 型でないといけない。 110 cv2.drawContours(c_frame, [box.astype(int)], -1, (0, 255, 0), 2) 111 112 113 def within(line, rect): 114 115 p1, p2 = tuple(line[:2]), tuple(line[2:]) 116 # 線の始点と終点が長方形内に含まれるかどうか 117 return cv2.pointPolygonTest(box, p1, False) >= 0 and \ 118 cv2.pointPolygonTest(box, p2, False) >= 0 119 120 LSD = cv2.createLineSegmentDetector() 121 lines, width, prec, nfa = LSD.detect(edges) 122 lines = np.squeeze(lines) 123 124 for line in lines: 125 p1, p2 = tuple(line[:2]), tuple(line[2:]) 126 127 if within(line, rect): 128 # 長方形に含まれる場合は赤色で描画 129 cv2.line(c_frame, p1, p2, (0, 0, 255), 2) 130 else: 131 # 長方形に含まれない場合は赤色で描画 132 cv2.line(c_frame, p1, p2, (255, 0, 0), 2) 133 134 cv2.imshow(ORG_WINDOW_NAME, c_frame) 135 #cv2.imshow('res',gauss) 136 #cv2.imshow('4', disp_in_img) 137 #cv2.imshow('3', gray) 138 #cv2.imshow("1", th1) 139 #cv2.imshow("2", edges) 140 # 141 #rec.write(gray) 142 # rec2.write(c_frame) 143 #rec3.write(th1) 144 #rec4.write(edges) 145 #rec5.write(gauss) 146 147 # 148 key = cv2.waitKey(INTERVAL) 149 if key == ESC_KEY: 150 break 151 152 # 153 end_flag, c_frame = cap.read() 154 155 # 156 cv2.destroyAllWindows() 157 cap.release() 158 rec.release() 159

このようなエラーがでてしまいます
Traceback (most recent call last):
File "kamera.py", line 35, in <module>
height, width, channels = c_frame.shape
AttributeError: 'NoneType' object has no attribute 'shape'

カメラが画像を読み込めていないことが原因だとおもうのですが、以前動いたものがうごかくなるということはどういったことなのでしょうか

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

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

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

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

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

hayataka2049

2018/09/13 07:19 編集

エラーは省略せず全文掲載してください。あとデバイスの接続を確認してください
uriuri

2018/09/13 07:25

エラーについて追記しまdした。デバイスの接続は確認し大丈夫です。
hayataka2049

2018/09/13 07:31

DEVICE_ID = 1は正しいですか? 2台以上カメラが接続されている際の設定だと思いますが……あとend_flagはどうなりますか?
uriuri

2018/09/13 07:43

こちらを参考にしましたhttps://qiita.com/hitomatagi/items/12a2eceaf65f142ec3df  DEVICE_IDは内蔵インカメラとwebカメラがあり0と1をどちらも試しましたがダメでした。end_flagは次フレームの読み込みをしています。
guest

回答1

0

ベストアンサー

キャプチャー以外の部分は先程のご質問で動くことが確認できたと思うので、新しく追加した以下の部分を動くようにするのが解決への道筋だと思います。

DEVICE_ID は固定のものではなく、PC に挿しているデバイス等の状況によって変わってきます。

  • USB カメラ等であれば、カメラメーカーのサイトにキャプチャーソフト等が配布されていると思うので、それでそもそもカメラのキャプチャーはできているかを確認し、OpenCV の問題なのかをまず切り分けしてください。
  • DEVICE_ID = 0, 1, 2, ... と変えてみて、確認してください。

python

1import numpy as np 2import cv2 3 4DEVICE_ID = 1 5cap = cv2.VideoCapture(DEVICE_ID) 6 7while True: 8 ret, frame = cap.read() 9 if not ret: 10 print('failed to capture') 11 break 12 13 cv2.imshow('frame', frame) 14 15 # q キーを押したら終了 16 if cv2.waitKey(1) & 0xFF == ord('q'): 17 break 18 19cap.release() 20cv2.destroyAllWindows()

投稿2018/09/13 08:10

tiitoi

総合スコア21956

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

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

uriuri

2018/09/13 08:34

違うノートパソコンで提示されたコードを試した結果、インカメラ、webカメラどちらも動きました 現在使っているパソコンが悪いのですかね。
tiitoi

2018/09/13 08:39

問題となっているPCでカメラを動かせた実績はありますか? まず以下を確認してみてください - OpenCV ではなく、お使いのカメラメーカーのサイトで配布されているキャプチャーソフト等は動くかどうか - カメラのドライバは導入済みかどうか
uriuri

2018/09/13 08:50

問題となっているPCでカメラを動かしたのが今回は初です 以前、違うPCでカメラの起動を行っていたので今使っている方のカメラのドライバなどの設定を見直したいと思います。
uriuri

2018/09/13 08:59

前のPCで質問に掲載したコードを試した結果、映りました しかし、カメラ映像中に処理できるのもがないとカメラが切れてしまいます。 そして Traceback (most recent call last): File "kamera.py", line 115, in <module> for line in lines: TypeError: iteration over a 0-d array とエラー文が出てしまいます。 カメラは常に動いたままで、映像中に入ったものを処理する形にしたいと思っています。 アドバイスいただけると幸いです。
tiitoi

2018/09/13 09:10

では、lines が見つかったときのみ処理するようにしてください。 ``` if lines is not None: lines = np.squeeze(lines) for line in lines: p1, p2 = tuple(line[:2]), tuple(line[2:]) if within(line, rect): # 長方形に含まれる場合は赤色で描画 cv2.line(c_frame, p1, p2, (0, 0, 255), 2) else: # 長方形に含まれない場合は赤色で描画 cv2.line(c_frame, p1, p2, (255, 0, 0), 2) ```
uriuri

2018/09/13 09:34

カメラ中に処理するものがなくても維持できるようになりました。 しかしある程度動かしていると Traceback (most recent call last): File "kamera.py", line 117, in <module> p1, p2 = tuple(line[:2]), tuple(line[2:]) IndexError: invalid index to scalar variable. となりまた切れてしまいました。 IndexErrorが - sequence(tuple, list, string)の渡せる数の限界を超えている。 <参考サイト> https://qiita.com/weedslayer/items/b15cd3d244352844ba94 簡単に言うとカメラ中に処理するものが多すぎてエラーを吐いたということでしょうか。
tiitoi

2018/09/13 09:44

numpy のスカラーに対して、インデックス操作を行おうとして起こるエラーです。 ``` a = np.array([0, 1, 2]) print(type(a[0])) # <class 'numpy.int64'> a[0][1] # IndexError: invalid index to scalar variable. ``` 今回に限らず、まずエラーが起こったときは、その箇所の変数を print() してみて、どうなっているのか確認してください。 今回は p1, p2 = tuple(line[:2]), tuple(line[2:]) でエラーが起こっているので、 まず print(line) としてみて、どうなっているのか確認してみましょう。
uriuri

2018/09/13 10:00

エラーが起きた場合、print()を心がけたいと思います。 実際にprint("line",line)を行った結果です。 . . . ('line', array([133.37189, 276.04282, 121.66857, 272.57083], dtype=float32)) ('line', array([119.49292 , 274.31964 , 123.055664, 281.90756 ], dtype=float32)) ('line', array([116.956635 , 0.7023167, 101.750465 , 16.757051 ], dtype=float32)) ('line', array([105.71018 , 15.714129 , 119.14014 , 2.8792481], dtype=float32)) ('line', array([111.56482 , 17.72207 , 130.58844 , 3.0775146], dtype=float32)) ('line', array([124.37761 , 4.3783975, 111.68756 , 14.13111 ], dtype=float32)) Traceback (most recent call last): File "kamera.py", line 119, in <module> p1, p2 = tuple(line[:2]), tuple(line[2:]) IndexError: invalid index to scalar variable.
tiitoi

2018/09/13 10:09

提示されたのは、エラーになる直前の line の値ですか? そうだとしたら、(4, ) の numpy 配列に対して、インデックス操作できるはずですから、エラーにならないはずなのですが ``` line = np.array([124.37761 , 4.3783975, 111.68756 , 14.13111 ]) p1, p2 = tuple(line[:2]), tuple(line[2:]) print(p1, p2) # (124.37761, 4.3783975) (111.68756, 14.13111) ```
tiitoi

2018/09/13 10:21 編集

lines = np.squeeze(lines) が原因ですね。 N 本見つかった時、lines の返り値が (N, 1, 4) と余分な次元が挟まっているのが邪魔だったので、(N, 4) としたのですが、1本しか見つからないときは、(1, 1, 4) なので (4,) という配列になってしまってエラーになっているのだと思います。 numpy の関数で、axis=1 の次元だけ消してください。
tiitoi

2018/09/13 10:25

``` import numpy as np a = np.zeros((5, 1, 4)) b = np.zeros((1, 1, 4)) print(np.squeeze(a).shape) # (5, 4) print(np.squeeze(b).shape) # (4,) print(np.squeeze(a, axis=1).shape) # (5, 4) print(np.squeeze(b, axis=1).shape) # (1, 4) ``` 修正方法 ``` lines = np.squeeze(lines) ``` ↓ ``` lines = np.squeeze(lines, axis=1) ```
uriuri

2018/09/13 10:37

わかりやすい説明ありがとうございます 本当にためになります 1本しか見つからなかったときにエラーをはいていたのですね 実際に動かしてみたところ問題なくいけました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問