如何循环遍历 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 = y
和col = x
。
如果你的矩阵只有一行,那么行索引必须是0
,而不是1
。
你的矩阵是unsigned char的单通道,所以需要使用at<uchar>
在实践中,使用:
uchar color = smaller.at<uchar>(0, x);
cout << int(color);
或使用索引:
uchar color = smaller.at<uchar>(x);
【讨论】:
以上是关于如何循环遍历 Matrix 数据的显示方式?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jquery 循环遍历此 JSON 数据以显示 klout 分数?