0

opencvで3チャンネルの画像にインデックスを付けようとしています。

画像ファイルを読み込むと、このコードは機能します

int Blue  = LeftCol.at<cv::Vec3b>(v,u)[0];
int Green = LeftCol.at<cv::Vec3b>(v,u)[1]; 
int Red   = LeftCol.at<cv::Vec3b>(v,u)[2]; 

しかし、Webカメラ入力を使用するとクラッシュします。ウェブカメラには3つのチャネルがあり、でu,v始まり0,0ます。なぜうまくいかないのかわかりません。、、、、のすべてのバリエーションVec3bを試しましVec3iVec3sVec3fVec3d

私は迷子になっています....なぜこのウェブカメラ画像をインデックスに登録できないのですか?

編集

何時間も経った今、これが私がやらなければならないところです...これがプログラムの概要です。関数内で上記の問題が発生していました。だから私は基本に戻り、関数の前にマトリックスを見ようとしています...

void main (int argc, char** argv) {
Mat LeftCol;
while (1==1) {
    if (ProgramMode == "Files") {
        //read in the colour images
        LeftCol  = imread(ColImLeft.c_str(),1);
        RightCol = imread(ColImRight.c_str(),1);

    } else if (ProgramMode == "Camera") {
        VideoCapture CapLeft, CapRight;
        CapLeft.open(1);
        CapRight.open(2);

        CapLeft  >> LeftCol;
        CapRight >> RightCol;

                    //THIS WORKS, THIS PIXEL VALUES ARE DISPLAYED
        cout << "uchar" << endl;
        for (int x=0;x<10;x++) {
            for (int y=0;y<10;y++) {
                int pixel = LeftCol.at<cv::Vec3b>(x,y)[0];
                cout << pixel;
            }
            cout << endl;
        }
    } //end if

            ///////ADDED THIS BIT ////////
    cout << "channels = " << LeftCol.channels() << endl;
            //^^This bit works, output shows "channels = 3"

            //vv This bit doesn't work.... so there's a problem with LeftCol.
            //I wonder if reading the data like CapLeft  >> LeftCol; is changing something
    imshow("Test",LeftCol);
            ///////ADDED THIS BIT ////////

           //THIS DOES NOT WORK WHEN USING THE CAMERA INPUT, PROGRAM CRASHES
    cout << "uchar" << endl;
    for (int x=0;x<10;x++) {
        for (int y=0;y<10;y++) {
            int pixel = LeftCol.at<cv::Vec3b>(x,y)[0];
            cout << pixel;
        } //end for
        cout << endl;
    } //end for

   } //end while
} //end main

確かに私はそれを機能させましたが、それは理想的ではありません。Matファイルを読み込んでクローンを作成するための一時ファイルを作成しています。

        Mat TempLeft;
        Mat TempRight;

        VideoCapture CapLeft, CapRight;
        CapLeft.open(1);
        CapRight.open(2);

        CapLeft  >> TempLeft;
        CapRight >> TempRight;

        LeftCol = TempLeft.clone();
        RightCol = TempRight.clone();
4

3 に答える 3

2

OpenCVは、可能な限り画像のソフトコピーを作成します。ドキュメントから

配列の割り当ては、ヘッダーをコピーして参照カウンターを増やすだけなので、O(1)操作です。Mat :: clone()メソッドを使用すると、必要なときに配列の完全な(深い)コピーを取得できます。

何が起こっているのかはLeftCol、まだオブジェクトに属しているデータを使用しているのではないかと思いVideoCaptureます。この場合CapLeft、それらCapRightの最後でスコープから外れるとif、デストラクタによって閉じられ、LeftColまだ指している画像データが破棄されます。

考えられる解決策は、実行中にイメージのクローンを作成するかVideoCapture CapLeft, CapRight;、ifブロックの外側で宣言することです(必要に応じて、イメージを内側で開くことができます)。

于 2012-09-18T10:48:03.540 に答える
1

cv :: Mat.type()でタイプを確認し、cv :: Mat.channels()でチャンネル数を確認できます。

カメラから返されたデータは、B、G、Rの順序でVec3b(つまり、uchar * 3)に変換されます。

画像が有効であると確信しています-どこかに間違いがありますか?

于 2012-09-17T15:06:20.267 に答える
1

すべてのVec*の組み合わせを試したという理由だけで、ここに完全なリスト、私の2ctがあります。

typedef Vec< uchar, 3 >     Vec3b   (so normal 8 bit)
typedef Vec< double,3 >     Vec3d   (so normal double precision)
typedef Vec< float, 3 >     Vec3f   (so normal floating point)
typedef Vec< int,   3 >     Vec3i   (normal int)
typedef Vec< short, 3 >     Vec3s
typedef Vec< ushort 3 >     Vec3w   (so normal 16 bit)
于 2014-02-01T23:45:45.073 に答える