如何循环遍历 Matrix 数据的显示方式?

Posted

技术标签:

【中文标题】如何循环遍历 Matrix 数据的显示方式?【英文标题】:How do I loop through Matrix data how it appears? 【发布时间】:2016-07-27 16:41:03 【问题描述】:

情况

我有一个 300 列和 1 行的矩阵。当我cout <<它时,我得到:

[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0]

...这是我期望/想要的形式。

问题

但是,当我遍历它时,我想在每次迭代中获取每个值。然而,相反,我得到了一个稍微不同的顺序(虽然有时它非常相似)。

代码

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

using namespace std;
using namespace cv;

int main()


  Mat test(1,300,CV_8UC1, 255);
    cout << test;

    Mat frame, grayFrame,threshFrame,smaller;

    VideoCapture cap(0);

    while(true)
        cap.read(frame);
        cvtColor(frame, grayFrame, cv::COLOR_RGB2GRAY);
        threshold(grayFrame, threshFrame, 160, 255, THRESH_BINARY);
        smaller = threshFrame(Rect(0,0,300,1));
        cout << smaller;

        for(int x=0;x<smaller.cols;x++)
            int color = smaller.at<Vec3b>(x,1)[0];
            cout << color;

        

        break;        
    


...而且奇怪的输出不遵循与原始矩阵完全相同的 0 和 255 顺序:

00000000000000000000000000000000000000000000000000000000000000000000000000000000000002552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

矩阵一开始有很多 0,很少有 255,因为循环输出有很多 255,而开头的 0 不多。

本质上,我想遍历首先显示的矩阵,并为每次迭代获取每个值。所以 0,0,255,255... 等等。

【问题讨论】:

您没有在值之间打印空格... 我的问题与空格、数据结构无关。一个是数组,一个是 int 输出...我的意思是 ORDER。您会注意到顺序仍然不同,原始开始“0,0,255”,循环开始“255,255,255” 就是这样。你能提供一个MCVE吗? 如何让它更简单?我有一个基本的单通道矩阵。一旦我遍历它,它就会变得不同。你将如何循环遍历它?我一定做错了什么。非常感谢。 哪个词让你感到困惑?最小、完整还是可验证? 【参考方案1】:

你在看垃圾。

at 函数需要(row, col),而不是(x, y)。请记住row = ycol = x

如果你的矩阵只有一行,那么行索引必须是0,而不是1

你的矩阵是unsigned char的单通道,所以需要使用at&lt;uchar&gt;

在实践中,使用:

uchar color = smaller.at<uchar>(0, x);
cout << int(color);

或使用索引:

uchar color = smaller.at<uchar>(x);

【讨论】:

以上是关于如何循环遍历 Matrix 数据的显示方式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jquery 循环遍历此 JSON 数据以显示 klout 分数?

如何循环遍历二维数组以在页面上显示数据?

“圆圈”中的遍历矩阵

循环遍历包含 dicts 的列表并以某种方式显示它

如何使用foreach循环进入另一个foreach循环来遍历c​​odeigniter中的两个不同的数据表?

循环遍历 JSON 数据并动态显示它们