プログラミング初心者です。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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/30 04:29
2021/11/30 07:41
2021/11/30 22:52 編集
2021/12/01 01:09