4

現在、Iamはステレオペアの視差を見つけることに取り組んでいます。20チャンネルのデータセットを作成する状況があります。3次元の配列を宣言するとエラーが発生しました。代わりに、データを保存できるように20チャンネルの画像を作成できます。メモリ割り当てやある種のエラーなしで結果を得るには、追加の条件を含める必要があります。20チャネルのイメージを作成することは私にとっても快適です...

4

2 に答える 2

14

OpenCVのC++インターフェイスは、Cインターフェイスのタイプcv::Matを置き換えて改善するを提供します。IplImageこの新しいタイプは、以下のコンストラクターを含むいくつかのコンストラクターを提供します。これらのコンストラクターを使用して、パラメーターを介して必要なチャネル数を指定できますtype

Mat::Mat(int rows, int cols, int type)

サンプルコード:

#include <cv.h>
#include <highgui.h>
#include <iostream>

void test_mat(cv::Mat mat)
{
    std::cout << "Channels: " << mat.channels() << std::endl;
}

int main(int argc, char* argv[])
{
    cv::Mat mat20(1024, 768, CV_8UC(20));
    test_mat(mat20);

    return 0;
}
于 2012-06-14T13:32:52.667 に答える
3

Opencvは、コンパイル時にタイプとサイズがわかっている小さな行列のテンプレートクラスを実装します。

template<typename _Tp, int m, int n> class Matx {...};

Matxの部分的なケースの指定されたテンプレートを作成できます。これは、次のような1、2、または3つの「チャネル」用にopencvで既に記述されているようなcv::Vecです。

typedef Vec<uchar, 3> Vec3b; // 3 channel -- written in opencv 
typedef Vec<uchar, 20> Vec20b; // the one you need

次に、新しい(ucharの20チャネル)オブジェクトのマトリックスを宣言します。

cv::Mat_<Vec20b> myMat;
myMat.at<Vec20b>(i,j)(10) = .. // access to the 10 channel of pixel (i,j) 
于 2012-06-14T13:43:50.133 に答える