web-dev-qa-db-ja.com

バイナリで画像を処理した後に輪郭を視覚化するために、OpenCV(Python)でグレースケール画像をRGBにどのように変換しますか?

リアルタイムアプリケーション用に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()
46
user391339

回答に対するコメントを促進しています:

簡単な方法は次のとおりです。

グレー画像を使用する代わりに、元の「フレーム」自体に描画することもできます。

難しい方法(実装しようとした方法):

backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)は正しい構文です。

84
Anoop K. Prabhu

これを試して:

import cv2
import cv

color_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)

Opencvの使用中に、定数の一部がcv2モジュールで定義され、他の定数がcvモジュールで定義されていることを発見しました。

8
delicasso

画像をグレースケールに変換すると、元に戻せません。 3つのチャンネルから1つのチャンネルに移動しました。戻ってみると、3つの数字はすべて同じになります。だから、短い答えはあなたが戻ることができないということです。 backtorgb関数がこのエラーをスローする理由は、次の形式である必要があるためです。

CvtColor(input, output, CV_GRAY2BGR)

OpenCVはRGBではなくBGRを使用するため、順序を修正すると機能しますが、画像はグレーのままになります。

5
grromrell