Caspar Wylie - 1 month ago 5
C++ Question

# How do I loop through Matrix data how it appears?

situation

I have a matrix which is 300 columns and 1 row. When i

`cout <<`
it, i get:

[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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]

..which is of the structure I expect/want.

problem

However, when I loop through it, i want to get each single value each iteration. However, instead I get a slightly different order (somtimes it is quite similar, though).

code

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

``````Mat frame, grayFrame,threshFrame,smaller;

VideoCapture cap(0);

while(true){
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;

}
``````

...and the weird output that does not follow the exact same order of 0s and 255s as the original Matrix:

``````00000000000000000000000000000000000000000000000000000000000000000000000000000000000002552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
``````

the matrix has many 0s at first, and few 255s, where as the loop output has many 255s, and not so much beginning 0s. Don't bother spending ages checking theres a difference, trust me when i say there is!

Essentially, I want to loop through the matrix first shown, and for each iteration, get each value. So 0,0,255,255...etc. Would appreciate any help or direction! thanks.

• The `at` function needs `(row, col)`, and not `(x, y)`. Remember that `row = y`, and `col = x`.

• If your matrix is just a single row, the row index must be `0`, not `1`.

• Your matrix is a single channel of unsigned char, so you need to use `at<uchar>`

In practice, use:

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

or using indices:

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