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

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

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

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

Raspberry Pi

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

Python

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

Q&A

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Raspberry Pi

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

Python

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

1回答

0グッド

0クリップ

609閲覧

投稿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')

以下のような質問にはグッドを送りましょう

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

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

2022/11/02 04:50依頼された後にこの質問は修正されています

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

2022/11/02 02:30依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

2022/11/02 06:21

こちらの質問が他のユーザーから「意図的に内容が抹消された質問」という指摘を受けました。

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」の最後に書き足せばいいのではないですかね

回答1

1

ベストアンサー

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

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

総合スコア1066

ALOHAMS👏を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

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 編集

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

OpenCV

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

Raspberry Pi

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

Python

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