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

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

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

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

解決済

1回答

1505閲覧

OpenCV-Pythonで撮影した写真を輪郭抽出

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2022/11/02 02:04

編集2022/11/02 05:34

前提

教えてください!

実現したいこと

問題・課題


できようにしたい。

ソース付きで教えてくれると幸いです。

該当のソースコード

Python
ソースコード

import cv2 import os def save_frame_camera_key(device_num, dir_path, basename, ext='jpg', delay=1, window_name='frame'): cap = cv2.VideoCapture(device_num) if not cap.isOpened(): return os.makedirs(dir_path, exist_ok=True) base_path = os.path.join(dir_path, basename) n = 0 while True: ret, frame = cap.read() cv2.imshow(window_name, frame) key = cv2.waitKey(delay) & 0xFF if key == ord('c'): cv2.imwrite('{}_{}.{}'.format(base_path, n, ext), frame) n += 1 elif key == ord('q'): break cv2.destroyWindow(window_name) #画像のサイズ縮小 height = image.shape[0] width = image.shape[1] image = cv2.resize(image,(round(width/4), round(height/4))) image_copy1 = image.copy() #グレースケール化 image_copy1 = cv2.cvtColor(image_copy1,cv2.COLOR_BGR2GRAY) #閾値処理 ret,thresh = cv2.threshold(image_copy1,128,255,cv2.THRESH_BINARY) #輪郭検出 (cv2.ChAIN_APPROX_SIMPLE) contours1, hierarchy1 = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #輪郭の描画 cv2.drawContours(image, contours1, -1, (0, 255, 0), 2, cv2.LINE_AA) #実行結果 cv2.imshow('Drawn contours', image) cv2.imshow('Original', image_copy1) cv2.waitKey(0) cv2.destroyAllWindows() save_frame_camera_key(0, 'syasin', 'IMG_RINKAKU')

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

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

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

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

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

jbpb0

2022/11/02 05:20

質問のコードから、下記のようにしたいのではと想像しましたけど、合ってますか? ・キーボードの「q」を入力するまでは、カメラで撮影した映像(動画)を画面に表示し続ける ・キーボードの「c」を入力した瞬間の画像(フレームを取り出した静止画)で、輪郭検出してファイル保存する
jbpb0

2022/11/02 05:24

質問のコードを以下のように変更したら、キーボードで「q」を入力した時点の撮影画像で輪郭検出した結果が、画面に表示されると思います ・「#画像のサイズ縮小」の次の行から、「save_frame_camera_key(0, 'syasin', 'IMG_RINKAKU')」の前の行までを、行頭にスペース四つのインデントを入れる ・全ての「image」を、「frame」に書き換える > カメラで撮影した静止画像の輪郭検出を行いIMG_RINKAKU.JPGファイルに保存 画面に表示されてる「輪郭検出結果」の画像を、画像ファイルに保存するコードを関数「save_frame_camera_key」の最後に書き足せばいいのではないですかね
guest

回答1

0

ベストアンサー

写真を撮影し、保存はされたが輪郭抽出ができない。

save_frame_camera_key()にてカメラの映像frameを取得するものの,それを保存するのみの動作になっています.

この映像frameに対して輪郭抽出cv2.findContours()を行ってください.

輪郭抽出のソースを追加したら動かないです。

変数imageは輪郭抽出に関連するコード以前に宣言されておらず,エラーが出ます.
先述の通り,frameimageとして扱うことで輪郭抽出ができるようになります.

変数宣言や関数,その他Pythonの基礎について不明なら,チュートリアルに取り組んで扱いを学んでください.

追記

1枚だけ保存できれば良いとのことだったのでそれを実現しました.

Python

1import cv2 2import os 3 4def writeContour(image): 5 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 6 ret, thresh = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY) 7 contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 8 9 cv2.drawContours(image, contours, -1, (0, 255, 0), 2, cv2.LINE_AA) 10 return image 11 12def save_frame_camera_key(device_num, dir_path, basename, ext='jpg', delay=1, window_name='frame'): 13 cap = cv2.VideoCapture(device_num) 14 15 if not cap.isOpened(): 16 return False 17 18 os.makedirs(dir_path, exist_ok=True) 19 base_path = os.path.join(dir_path, basename) 20 21 ret, frame = None, None 22 23 while not ret: 24 ret, frame = cap.read() 25 frame = writeContour(frame) 26 cv2.imshow(window_name, frame) 27 cv2.imwrite(f'{base_path}.{ext}', frame) 28 cv2.destroyWindow(window_name) 29 30save_frame_camera_key(0, 'syasin', 'IMG_RINKAKU')

依然として質問内容は「やって欲しいことの丸投げ」でしかなかったのですが今後の成長を期待しての解答とします.

投稿2022/11/02 02:37

編集2022/11/02 04:46
PondVillege

総合スコア1579

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

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

退会済みユーザー

退会済みユーザー

2022/11/02 03:14 編集

frameをimageとして扱うのはどうするんですか? 映像frameに対して輪郭抽出cv2.findContours()を行うも分からないです....
PondVillege

2022/11/02 03:36

そもそもsave_frame_camera_key()は任意のキーが押されるまで画像を取得するものですが,その間も輪郭抽出したい.ということですか?要件定義が不明すぎてコードを書くに至らない.というのが現状です. > frameをimageとして扱うのはどうするんですか frameの持つ値をimageに渡してください > 映像frameに対して輪郭抽出cv2.findContours()を行うも分からない 質問に書かれてるコードでは,変数imageが画像だったとき輪郭抽出できる完全なコードです.すなわち,それを書かれたあなたは「輪郭抽出ができる」ということなるんですけど,「わからない」は矛盾してませんか? 変数frameと変数imageの扱いを同一にしたら輪郭抽出できます.要件定義が不明な現状ではあなたのやりたいことと矛盾するかもしれないので,抽象的な解答になっています.
退会済みユーザー

退会済みユーザー

2022/11/02 05:35 編集

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問