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

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

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

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

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

解決済

opencvで寸法計測できるプログラムです。AttributeErrorが発生しています。

Rin2590
Rin2590

総合スコア21

OpenCV

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

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

1回答

0リアクション

0クリップ

320閲覧

投稿2022/09/06 09:12

前提

opencvを用いて物体の寸法計測を行うプログラムです。

以下のサイトのコードをそのまま実行しているのですが、AttributeErrorが発生しています。
https://qiita.com/okm_6880/items/0f964484d570208d715d

コードが長くて申し訳ないのですが、opencvやpythonに詳しい方、ご回答お願いしたいです。

実現したいこと

プログラムを正常に動作させたいです。

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

line 28, in <module> for i,c in zip(ids.ravel(), corners): AttributeError: 'NoneType' object has no attribute 'ravel'

該当のソースコード

import cv2 import numpy as np # パラメータ blur = 11 # ぼかし x_dis, y_dis = (145,110) # ARマーカー間の実寸 size= 3 # 表示画像サイズ=ARマーカー間の実寸×size th = 130 # 閾値の初期値 cap = cv2.VideoCapture(0) # カメラ番号取得 aruco = cv2.aruco def nothing(x): pass cv2.namedWindow('binary') cv2.createTrackbar('threshold','binary', th , 256, nothing) while True: #try: ret, img = cap.read() # 戻り値 = ,カメラ画像 p_dict = aruco.getPredefinedDictionary(aruco.DICT_4X4_50) # ArUcoマーカーのdict取得(50ピクセル) corners, ids, rejectedImgPoints = aruco.detectMarkers(img, p_dict) # カメラ画像からArUcoマーカー検出 # 時計回りで左上から順に表示画像の座標をmに格納 m = np.empty((4,2)) # [x,y]の配列を4点分 corners2 = [np.empty((1,4,2))]*4 for i,c in zip(ids.ravel(), corners): corners2[i] = c.copy() m[0] = corners2[0][0][2] # マーカー0の右下 m[1] = corners2[1][0][3] # マーカー1の左下 m[2] = corners2[2][0][0] # マーカー2の左上 m[3] = corners2[3][0][1] # マーカー3の右上 width, height = (x_dis*size,y_dis*size) # 変形後画像サイズ x_ratio = width/x_dis y_ratio = height/y_dis marker_coordinates = np.float32(m) true_coordinates = np.float32([[0,0],[width,0],[width,height],[0,height]]) mat = cv2.getPerspectiveTransform(marker_coordinates,true_coordinates) # 画像サイズを任意の大きさに合わせる img_trans = cv2.warpPerspective(img,mat,(width, height)) tmp = img_trans.copy() # グレースケール変換 tmp = cv2.cvtColor(tmp, cv2.COLOR_BGR2GRAY) cv2.imshow('gray',tmp) # ぼかし処理 tmp = cv2.GaussianBlur(tmp, (blur, blur), 0) cv2.imshow('blur',tmp) # 二値化処理 gamma = cv2.getTrackbarPos('threshold','binary') th = cv2.getTrackbarPos('threshold','binary') _,tmp = cv2.threshold(tmp,th,255,cv2.THRESH_BINARY_INV) cv2.imshow('binary',tmp) # 輪郭検出 contours, hierarchy = cv2.findContours(tmp, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rect = cv2.minAreaRect(contours[0]) box = cv2.boxPoints(rect) box = np.int0(box) n, img_label, data, center = cv2.connectedComponentsWithStats(tmp) x, y = box[0] center =int(center[0][0]),int(center[0][1]) angle = rect[2] scale = 1.0 mat = cv2.getRotationMatrix2D(center, angle , scale) img_trans = cv2.warpAffine(img_trans, mat , (width,height)) #アフィン変換 color_lower = np.array([0, 0, 0]) # 抽出する色の下限(BGR形式) color_upper = np.array([0, 0, 0]) # 抽出する色の上限(BGR形式) img_mask = cv2.inRange(img_trans, color_lower, color_upper) # 範囲からマスク画像を作成 img_trans = cv2.bitwise_not(img_trans, img_trans, mask=img_mask) # 元画像とマスク画像の演算(背景を白くする) img_trans_mesure = img_trans.copy() img_trans = cv2.cvtColor(img_trans, cv2.COLOR_BGR2GRAY) # ぼかし処理 img_trans = cv2.GaussianBlur(img_trans, (blur, blur), 0) # 二値化処理 gamma = cv2.getTrackbarPos('threshold','binary') th = cv2.getTrackbarPos('threshold','binary') _,img_trans = cv2.threshold(img_trans,th,255,cv2.THRESH_BINARY_INV) contours, hierarchy = cv2.findContours(img_trans, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) x, y, w, h = cv2.boundingRect(contours[0]) img_trans_mesure = cv2.rectangle(img_trans_mesure, (x, y), (x+w, y+h), (0, 0, 255), 2) cv2.putText(img_trans_mesure, "width={:.1f}mm".format(w/x_ratio),(int(0), int(30)), cv2.FONT_HERSHEY_SIMPLEX,0.65, (0, 0, 255), 2) cv2.putText(img_trans_mesure, "hight={:.1f}mm".format(h/y_ratio),(int(0), int(50)), cv2.FONT_HERSHEY_SIMPLEX,0.65, (0, 0, 255), 2) cv2.imshow('raw',img) cv2.imshow('image',img_trans_mesure) print(w/x_ratio,h/y_ratio) key = cv2.waitKey(1) if key == ord("q"): break # ARマーカーが隠れた場合のエラーを無視する # except ValueError: # print("ValueError") # except IndexError: # print("IndexError") # except AttributeError: # print("AttributeError") cv2.destroyAllWindows()

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

try-exceptはエラーの詳細が知りたかったため、コメントにしています。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/09/06 10:41

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

meg_

2022/09/06 10:41

> AttributeError: 'NoneType' object has no attribute 'ravel' idsが「None」になっていませんか?カメラ画像はちゃんと取得できていますか?
Rin2590

2022/09/07 00:14

megさんご指摘ありがとうございます。 ご指摘の通り、ウォッチで変数を確認したところ、idsがNoneになっていました。 サイトのコードをそのまま実行しているのですが、どうしてNoneになるか分からずにいます。 何か解決方法やヒントがあれば、是非教えていただきたいです。
can110

2022/09/07 01:06

マーカーが検出できなかったのではないでしょうか。 静止画でよいのでエラー発生時に利用した画像を提示すると回答得られやすくなると思います。
meg_

2022/09/07 03:17

ret, img, p_dict の値はどうなっていますか?
jbpb0

2022/09/07 09:45

カメラから画像を取得できなかった場合とか、画像からマーカーが検出できなかった場合は、whileループ内の以降の処理をスキップしてwhileループの先頭に戻って、カメラから画像を取得するところからやり直すようにしたら、いかがでしょうか
Rin2590

2022/09/07 10:37

たくさんの助言をありがとうございます。 皆さんのおっしゃる通り、マーカーの検出ができていなかったことが原因でした。 静止画で実行してみて上手くいったので、リアルタイムでもマーカーに注意して実行したところキレイに寸法を計測することができました。 質問してよかったです。ありがとうございました!

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

OpenCV

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

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