私は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)構造体を使用していると思います。
まず、イメージを作成するには次の情報が必要です。
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
グレースケール画像の場合は黒です。一緒に混ぜないでください。
シングルチャネルイメージまたはマルチチャネルイメージを作成できます。
単一チャネルイメージの作成: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