リアルタイムアプリケーション用にOpenCVを使用して画像処理を学習しています。画像にしきい値を適用し、輪郭を緑色でラベル付けしたいのですが、画像が白黒のため、輪郭が緑色で表示されません。
プログラムの初期に、grey = cv2.cvtColor(frame、cv2.COLOR_BGR2GRAY)を使用してRGBからグレースケールに変換しましたが、戻るために混乱しており、関数backtorgb = cv2.cvtColor(gray、cv2.CV_GRAY2RGB)が与えていますAttributeError:「モジュール」オブジェクトには属性「CV_GRAY2RGB」がありません。
以下のコードは緑色で輪郭を描いているようには見えません-これはグレースケール画像だからですか?その場合、グレースケール画像をRGBに変換して、輪郭を緑色で視覚化できますか?
import numpy as np
import cv2
import time
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, gb = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)
gb = cv2.bitwise_not(gb)
contour,hier = cv2.findContours(gb,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contour:
cv2.drawContours(gb,[cnt],0,255,-1)
gray = cv2.bitwise_not(gb)
cv2.drawContours(gray,contour,-1,(0,255,0),3)
cv2.imshow('test', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
回答に対するコメントを促進しています:
簡単な方法は次のとおりです。
グレー画像を使用する代わりに、元の「フレーム」自体に描画することもできます。
難しい方法(実装しようとした方法):
backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)
は正しい構文です。
これを試して:
import cv2
import cv
color_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)
Opencvの使用中に、定数の一部がcv2モジュールで定義され、他の定数がcvモジュールで定義されていることを発見しました。
画像をグレースケールに変換すると、元に戻せません。 3つのチャンネルから1つのチャンネルに移動しました。戻ってみると、3つの数字はすべて同じになります。だから、短い答えはあなたが戻ることができないということです。 backtorgb関数がこのエラーをスローする理由は、次の形式である必要があるためです。
CvtColor(input, output, CV_GRAY2BGR)
OpenCVはRGBではなくBGRを使用するため、順序を修正すると機能しますが、画像はグレーのままになります。