Caspar Wylie Caspar Wylie - 3 months ago 9
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){
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;

}


...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.

Answer

You're reading garbage.

  • 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);