4

目前我正在寻找立体对的差异。我在创建 20 个通道数据集时遇到了一种情况,当我声明 3 维数组时它给出了错误,我可以创建 20 个通道的图像以便我可以存储数据。如果可以的话,我必须包括哪些附加条件才能获得结果,而不会出现任何内存分配错误或......。创建 20 个通道的图像对我来说甚至会很舒服......

4

2 回答 2

14

OpenCV 的 C++ 接口出现cv::Mat,替代并改进了IplImageC 接口的类型。这种新类型提供了几个构造函数,包括下面的构造函数,它可用于通过 param 指定所需的通道数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 部分案例的指定模板,它是 cv::Vec,就像那些已经在 opencv 中为 1,2 或 3 个“通道”编写的模板一样:

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

然后,声明一个新的(20 个 uchar 通道)对象的矩阵:

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 回答