Coutを使用して、OpenCVのマトリックスの値をコンソールにダンプします。 OpenvCVの型システムもC++テンプレートも、この単純なタスクを達成するのに十分に理解していないことがすぐにわかりました。
読者は、マットを印刷する小さな機能またはコードスニペットを投稿(または私を指す)しますか?
よろしく、アーロン
PS:古いCvMatインターフェイスではなく、新しいC++ Matインターフェイスを使用するコードが優先されます。
OpenCV C++ の「CatMatオブジェクトではなく」「Mat」オブジェクトの行列要素への最初の回答を参照してください。
次に、0,0ではなく、cout << M.at<double>(0,0);
のすべての要素をループします。
または、 新しいC++インターフェイス ( SSteve に感謝)
cv::Mat M;
cout << "M = "<< endl << " " << M << endl << endl;
matrix.at<type>(x,y)
を使用することは、Matオブジェクトを反復処理する最良の方法ではないと思います! matrix.at<type>(x,y)
を正しく思い出せば、呼び出すたびにマトリックスの先頭から反復します(ただし、間違っている可能性があります)。 cv::MatIterator_
を使用することをお勧めします
cv::Mat someMat(1, 4, CV_64F, &someData);;
cv::MatIterator_<double> _it = someMat.begin<double>();
for(;_it!=someMat.end<double>(); _it++){
std::cout << *_it << std::endl;
}
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <iomanip>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
double data[4] = {-0.0000000077898273846583732, -0.03749374753019832, -0.0374787251930463, -0.000000000077893623846343843};
Mat src = Mat(1, 4, CV_64F, &data);
for(int i=0; i<4; i++)
cout << setprecision(3) << src.at<double>(0,i) << endl;
return 0;
}
Opencv3を使用している場合は、python numpy style
:
Mat xTrainData = (Mat_<float>(5,2) << 1, 1, 1, 1, 2, 2, 2, 2, 2, 2);
cout << "xTrainData (python) = " << endl << format(xTrainData, Formatter::FMT_PYTHON) << endl << endl;
以下のように出力すると、読みやすくなります。詳細については here を参照してください。
ただし、ほとんどの場合、Matのすべてのデータを出力する必要はありません。0〜2行などの行範囲で出力できます。
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <iomanip>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
//row: 6, column: 3,unsigned one channel
Mat image1(6, 3, CV_8UC1, 5);
// output row: 0 ~ 2
cout << "image1 row: 0~2 = "<< endl << " " << image1.rowRange(0, 2) << endl << endl;
//row: 8, column: 2,unsigned three channel
Mat image2(8, 2, CV_8UC3, Scalar(1, 2, 3));
// output row: 0 ~ 2
cout << "image2 row: 0~2 = "<< endl << " " << image2.rowRange(0, 2) << endl << endl;
return 0;
}
以下のように出力します。