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

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

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

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

Q&A

解決済

2回答

2354閲覧

PythonとOpen CVを使用し、画像を二値化後、黒の面積の割合を条件として使用したいです。

ryu-12

総合スコア2

Python

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

0グッド

0クリップ

投稿2021/11/30 02:01

プログラミング初心者です。PythonとOpen CVを使用して画像を二値化し、黒と白の面積の割合を求め、求めた面積の割合を条件として使えないかと思い、下記のプログラムを試作してみました。

Python3

1import RPi.GPIO as GPIO #GPIO用のモジュールをインポート 2import time #時間制御用のモジュールをインポート 3import cv2 4 5def Black_Area(): 6 print('Black_Area='+str(black_area/whole_area*100)+'%') 7 8#画像の読み込み 9img=cv2.imread('photo.jpg',0) 10#特定の範囲のGaussian分布から閾値を自動で決めて二値化 11ret1,img_th=cv2.threshold(img,0,255,cv2.THRESH_OTSU) 12#全体の画素数 13whole_area=img_th.size 14#白部分の画素数 15white_area=cv2.countNonZero(img_th) 16#黒部分の画素数 17black_area=whole_area-white_area 18 19#それぞれの割合を表示 20print('White_Area='+str(white_area/whole_area*100)+'%') 21print('Black_Area='+str(black_area/whole_area*100)+'%') 22 23 24#画像の表示 25cv2.imshow("OpenCV_th",img_th) 26cv2.destroyAllWindows() 27 28#GPIOの設定 29GPIO.setmode(GPIO.BOARD) #GPIOのモードを"GPIO.BOARD"に設定 30GPIO.setup(15, GPIO.OUT) #GPIO15を出力モードに設定 31 32#GPIOの電圧を制御 33if 50 < Black_Area: #黒の面積の割合が50%より大きい場合 34 GPIO.output(15, GPIO.HIGH) #GPIO15の出力をHigh(3.3V)にする 35 time.sleep(5) #5秒間待つ 36 GPIO.output(15, GPIO.LOW) #GPIO15の出力をLow(0V)にする 37 38#GPIOをクリーンアップ 39GPIO.cleanup() 40```### 前提・実現したいこと 41二値化した画像から白と黒の面積の割合を求め、今回は黒の面積の割合を条件として扱い、黒の面積の割合が50%よりも大きいときにLEDを点灯させたいです。ですが、うまくいかず以下のようなエラーメッセージが出ました。 42 43### 発生している問題・エラーメッセージ 44 45```test,LED.py:30: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. 46 GPIO.setup(15, GPIO.OUT) #GPIO15を出力モードに設定 47Traceback (most recent call last): 48 File "/home/pi/Desktop/並列処理/test,LED.py", line 33, in <module> 49 if 50 < Black_Area: #黒の面積の割合が50%より大きい場合 50TypeError: '<' not supported between instances of 'int' and 'function' 51

試したこと

最初は条件の部分で使用している「Black_Area」を定義せずに使用したため「NameError」と出ました。そのため、「def」を使用して「Black_Area」定義してみましたがうまくいきませんでした。どなたか解決策を教えていただけないでしょうか。

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

Python 3.7.2 , Open CV 4.5.3

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

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

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

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

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

guest

回答2

0

ベストアンサー

TypeError: '<' not supported between instances of 'int' and 'function'

は、Google翻訳で翻訳すると

TypeError: '<'は 'int'と 'function'のインスタンス間ではサポートされていません

です。

python

1def Black_Area(): 2 print('Black_Area='+str(black_area/whole_area*100)+'%') 3

を関数ではなく

python

1Black_Area = black_area/whole_area*100

のように変数にしましょう。

投稿2021/11/30 02:44

ppaul

総合スコア24670

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

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

ryu-12

2021/11/30 04:29

ご回答ありがとうございます。これは、 def Black_Area(): print('Black_Area='+str(black_area/whole_area*100)+'%') の部分を Black_Area = black_area/whole_area*100 に変えるということでしょうか? もしそうであれば、 Traceback (most recent call last): File "/home/pi/Desktop/並列処理/test,LED.py", line 5, in <module> Black_Area = 'Black_Area='+str(black_area/whole_area*100)+'%' NameError: name 'black_area' is not defined というエラーが出てしまいました。繰り返し質問することになり申し訳ございませんが、どうすれば解決できるでしょうか?
ppaul

2021/11/30 07:41

いいえ、 def Black_Area(): print('Black_Area='+str(black_area/whole_area*100)+'%') を消して、そのかわりに Black_Area = black_area/whole_area*100 を入れるという意味です。
jbpb0

2021/11/30 22:52 編集

質問者さん Black_Area = black_area/whole_area*100 を追加する場所は、 #黒部分の画素数 black_area=whole_area-white_area と #GPIOの電圧を制御 if 50 < Black_Area: の間のどこか、です
ryu-12

2021/12/01 01:09

皆さん 修正すべき点のご指摘、本当にありがとうございます。ご指摘の通りに、 def Black_Area(): Black_Area = black_area/whole_area*100 に変えた後、条件の部分を、 if 50 < Black_Area: から、 if 50 < black_area/whole_area*100: に変えたところ、成功しました。ご丁寧に教えてくださった皆様、本当にありがとうございました。 自己解決欄に成功したプログラムを貼っておきます。
guest

0

Python3

1import RPi.GPIO as GPIO #GPIO用のモジュールをインポート 2import time #時間制御用のモジュールをインポート 3import cv2 4GPIO.setwarnings(False) 5 6def Black_Area(): 7 Black_Area = black_area/whole_area*100 8 9#画像の読み込み 10img=cv2.imread('photo.jpg',0) 11#特定の範囲のGaussian分布から閾値を自動で決めて二値化 12ret1,img_th=cv2.threshold(img,0,255,cv2.THRESH_OTSU) 13#全体の画素数 14whole_area=img_th.size 15#白部分の画素数 16white_area=cv2.countNonZero(img_th) 17#黒部分の画素数 18black_area=whole_area-white_area 19 20#それぞれの割合を表示 21print('White_Area='+str(white_area/whole_area*100)+'%') 22print('Black_Area='+str(black_area/whole_area*100)+'%') 23 24 25#画像の表示 26cv2.imshow("OpenCV_th",img_th) 27cv2.destroyAllWindows() 28 29#GPIOの設定 30GPIO.setmode(GPIO.BOARD) #GPIOのモードを"GPIO.BOARD"に設定 31GPIO.setup(15, GPIO.OUT) #GPIO15を出力モードに設定 32 33#GPIOの電圧を制御 34if 50 < black_area/whole_area*100: #黒の面積の割合が50%より大きい場合 35 GPIO.output(15, GPIO.HIGH) #GPIO15の出力をHigh(3.3V)にする 36 time.sleep(5) #5秒間待つ 37 GPIO.output(15, GPIO.LOW) #GPIO15の出力をLow(0V)にする 38 39#GPIOをクリーンアップ 40GPIO.cleanup()

投稿2021/12/01 01:00

ryu-12

総合スコア2

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

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

jbpb0

2021/12/01 01:23

def Black_Area(): Black_Area = black_area/whole_area*100 は要りません その関数は使われてないので
ryu-12

2021/12/01 02:17

jbpb0さん ご指摘、ありがとうございます。ご指摘の通りにdefの部分を消しても問題なく動作しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問