2016-07-27 1 views
-3

状況Matrixデータのループをどのように表示するのですか?

私は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と255Sのとまったく同じ順序に従わない奇妙な出力:

00000000000000000000000000000000000000000000000000000000000000000000000000000000000002552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552552550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

マトリックスは、多くの0を持っていますループ出力には多くの255があり、開始点0はそれほど多くないので、最初は255で、255はほとんどありません。

基本的に、最初に表示された行列をループし、繰り返しごとに各値を取得します。だから0,0,255,255 ...など

+0

あなたはあなたの値の間にスペースを印刷していません... – jaggedSpire

+0

私の問題は何もないスペース、データ構造を持つo。 1つは配列ですint出力...私はORDERを意味します。あなたは注文がまだ異なっていることに気づくでしょう、オリジナルは "0,0,255"を開始し、ループは "255,255,255" –

+0

です。あなたは[MCVE](http://stackoverflow.com/help/mcve)を提供しますか? – jaggedSpire

答えて

2

あなたはゴミを読んでいる。

  • at機能は(row, col)、およびない(x, y)を必要とします。 row = ycol = xを忘れないでください。

  • 行列が単一行の場合、行インデックスは0でなく、1でなければなりません。

  • あなたの行列は、unsigned char型の単一チャネルであるので、あなたは実際、使用の際にat<uchar>

を使用する必要があります。

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

またはインデックスを使用して:

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

ブリリアント。働くありがとう –

関連する問題