将数据推回矩阵并使用 imshow 显示该矩阵

Posted

技术标签:

【中文标题】将数据推回矩阵并使用 imshow 显示该矩阵【英文标题】:Push back Data into Matrix and show that matrix using imshow 【发布时间】:2015-11-20 04:29:27 【问题描述】:

我是 opencv 及其开发的新手。我想将无符号数据两个二维矩阵推回 Mat 类型对象。并使用 imshow(opencv 函数)显示 Mat 请找到我尝试过的以下代码片段。但我遇到了错误。任何帮助都会得到帮助。

Mat finaldata(20, 10000, CV_8UC1);
unsigned char test[20][10000]="0";// test having values i checked it.

    for (int coloumns=0 ;coloumns <20;coloumns++)
        
            for (int row=0 ;row <10000;row++)
            
                finaldata.push_back(test[coloumns][row]);
            

        

        imshow("window ", finaldata);
        waitKey(0);

错误

OpenCV Error: Assertion failed (DataType<_Tp>::type == type() && cols == 1) in push_back, file /usr/local/include/opencv2/core/mat.hpp, line 690
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /usr/local/include/opencv2/core/mat.hpp:690: error: (-215) DataType<_Tp>::type == type() && cols == 1 in function push_back

Program ended with exit code: 9

【问题讨论】:

你遇到了什么错误? 可能不是问题,但 Mat finaldata(20, 10000, CV_8UC1) 表示 20 ROWS 和 10000 列 @Micka 我改变了它,但我仍然遇到同样的错误。有什么想法吗? 我自己还没用过mat.push_back,不过我会看看 据我所知,`mat.push_back 将向您的矩阵添加另一个 ROW。因此,您创建了一个 20x10000 矩阵并尝试添加另一个单个元素作为新行。这不起作用,因为您的行有 10000 列,而不仅仅是 1 列。 【参考方案1】:

据我所知,`mat.push_back 将向您的矩阵添加另一个 ROW。因此,您创建了一个 10000x20 矩阵并尝试添加另一个单个元素作为新行。这不起作用,因为您的行有 20 列而不仅仅是 1 列。

这样就可以了:

cv::Mat finaldata(0, 0, CV_8UC1);
unsigned char test[20][10000]="0";// test having values i checked it.
for (int coloumns=0 ;coloumns <20;coloumns++)
    
        for (int row=0 ;row <10000;row++)
        
           finaldata.push_back(test[coloumns][row]);
        

    

但在这里你会得到一个 200000x1 的矩阵。你可以使用cv::reshape 或类似的:

finaldata = finaldata.reshape(1,10000); // if 10000 should be the number of rows.

但是,您可以直接使用您的数据而无需任何复制(使用指向数据的指针):

unsigned char test[20][10000]="0";// test having values i checked it.
cv::Mat finaldata(10000, 20, CV_8UC1, &test);

【讨论】:

【参考方案2】:

我不确定你是否可以使用 push_back 函数添加简单的数组。我更喜欢使用以下方式:

cv::Mat finaldata(20, 10000, CV_8UC1);
cv::Mat zero = cv::Mat::zeros(1, 10000, CV_8UC1);

for (int coloumns = 0; coloumns <20; coloumns++)

    finaldata.push_back(zero);


cv::imshow("window ", finaldata);
cv::waitKey(0);

【讨论】:

这将以 40x10000 矩阵结束

以上是关于将数据推回矩阵并使用 imshow 显示该矩阵的主要内容,如果未能解决你的问题,请参考以下文章

matlab 将数字矩阵转换成图像

将特征 C++ 块表达式推回 std::vector

如何在 Matlab 中显示图像的红色通道?

matlab图像处理

DAY13 Matlab矩阵操作随手练习

OpenCV利用矩阵实现图像旋转