0

opencv を学習する本の第 3 章に質問があります。

Create a two dimensional matrix with three channels of type byte with data size 100-by-100 and initialize all the values to 0.

Use the pointer element to access cvptr2D to point to the middle 'green' channel.Draw the rectangle between 20,5 and 40,20.

前編はなんとかできたのですが、後編がまとまりません。これが私がこれまでに行ったことです:

/*
    Create a two dimensional matrix with three channels of type byte with data size 100-    by-100 and initialize all the values to 0.
    Use the pointer element to access cvptr2D to point to the middle 'green' channel.Draw `enter code here`the rectangle between 20,5 and 40,20.
*/
void ex10_question3(){
    CvMat* m = cvCreateMat(100,100,CV_8UC3);
    CvSetZero(m);   // initialize to 0.
        uchar* ptr = cvPtr2D(m,0,1); // if RGB, then start from first RGB pair, Green.
    cvAdd(m,r); 
    cvRect r(20,5,20,15);
    //cvptr2d returns a pointer to a particular row element. 

}

四角形と行列の両方を追加することを検討していましたが、四角形は単なる座標と幅/高さであるため、明らかに機能しません。私は cvPtr2D() に慣れていません。エクササイズが私に何を求めているかをどのように視覚化できますか?また、誰かが正しい方向へのヒントを教えてくれますか? ソリューションは C でなければなりません。

インターリーブされた RGB チャネルに関する私の理解では、2 番目のチャネルが常に関心のあるチャネルになります。(配列インデックス: 1,4,6..)

4

2 に答える 2

0

このコードを試してください:

    cout<<"Chapter 3. Task 3."<<'\n';
CvMat *Mat=cvCreateMat(100, 100, CV_8UC3);
cvZero(Mat);
for(int J=5; J<=20; J++)
    for(int I=20; I<40; I++)
        (*(cvPtr2D(Mat, J, I)+1))=(uchar)(255);
cvNamedWindow("Chapter 3. Task 3", CV_WINDOW_FREERATIO);
cvShowImage("Chapter 3. Task 3", Mat);
cvWaitKey(0);
cvReleaseMat(&Mat);
cvDestroyAllWindows;
于 2013-10-09T17:58:35.930 に答える