web-dev-qa-db-ja.com

Opencvはcv :: Matを使用して新しいイメージを作成します

私はopencvが初めてで、いくつかのサンプルコードを試しています。

1つのコードで、Mat gr(row1,col1,CV_8UC1,scalar(0)); int x = gr.at<uchar> (row,col);

そして別のものでは、

Mat grHistrogram(301,260,CV_8UC1,Scalar(0,0,0));
line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);

私の質問は、2番目のコードでscalar(0,0,0)の代わりにscalar(0)を使用した場合、コードは機能しません。 1.なぜこれが起こるのか、両方ともマット画像構造を作成します。 2. const cv:Scalar&_sの目的は何ですか。

Opencvサイト(opencv.pdf、opencv2refman.pdf)およびOreillyのOpencv本からDocumentaionを検索します。しかし、説明された答えが見つかりませんでした。

Mat(int _rows、int _cols、int _type、const cv:Scalar&_s)構造体を使用していると思います。

12
Lusy7

まず、イメージを作成するには次の情報が必要です。

  1. 幅:301ピクセル
  2. 高さ:260ピクセル
  3. 各ピクセル値(強度)は0〜255です:8ビット符号なし整数
  4. すべてのRGBカラーをサポート:3チャンネル
  5. 初期色:黒=(B、G、R)=(0、0、0)

cv::Matを使用して画像を作成できます:

Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));

8Uは、8-bit[〜#〜] u [〜#〜]符号付き整数、C3は、3 CRGBカラーのチャネルを意味し、Scalar(0, 0, 0)は各ピクセルの初期値。同様に、

line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);

ポイントpt1からポイントpt2までgrHistogramに線を引くことです。線の色は白(255、255、255)で、太さは1ピクセル、接続線は8、シフトは0です。

RGBカラー画像ではなく、単純なグレースケール画像が必要な場合があります。つまり、3つではなく1つのチャネルを使用します。タイプはCV_8UC1に変更でき、1つのチャネルの強度のみを指定する必要があります(例:Scalar(0))。

問題に戻って、

なぜこれが起こっているのですか?両方ともマット画像構造を作成しますか?

Matのタイプを指定する必要があるためです。カラー画像CV_8UC3またはグレースケール画像CV_8UC1ですか?彼らは異なっている。 CV_8UC3イメージでScalar(255)を使用すると、考えているとおりにプログラムが機能しない場合があります。

Const cv:Scalar&_sの目的は何ですか?

cv::Scalarは、各ピクセルの強度値を指定するために使用されます。たとえば、タイプがCV_8UC3の場合、Scalar(255, 0, 0)は青で、Scalar(0, 0, 0)は黒です。または、Scalar(0)は、CV_8UC1グレースケール画像の場合は黒です。一緒に混ぜないでください。

21
mcchu

シングルチャネルイメージまたはマルチチャネルイメージを作成できます。

単一チャネルイメージの作成:Mat img(500, 1000, CV_8UC1, Scalar(70));

マルチチャンネル画像の作成:Mat img1(500, 1000, CV_8UC3, Scalar(10, 100, 150));

次のページからより多くの例と詳細を見ることができます。 https://progtpoint.blogspot.com/2017/01/tutorial-3-create-image.html

6