web-dev-qa-db-ja.com

OpenCV C ++で(Mat)マトリックスの値を出力する

Coutを使用して、OpenCVのマトリックスの値をコンソールにダンプします。 OpenvCVの型システムもC++テンプレートも、この単純なタスクを達成するのに十分に理解していないことがすぐにわかりました。

読者は、マットを印刷する小さな機能またはコードスニペットを投稿(または私を指す)しますか?

よろしく、アーロン

PS:古いCvMatインターフェイスではなく、新しいC++ Matインターフェイスを使用するコードが優先されます。

55
ahoffer

OpenCV C++ の「CatMatオブジェクトではなく」「Mat」オブジェクトの行列要素への最初の回答を参照してください。
次に、0,0ではなく、cout << M.at<double>(0,0);のすべての要素をループします。

または、 新しいC++インターフェイスSSteve に感謝)

cv::Mat M;

cout << "M = "<< endl << " "  << M << endl << endl;
82
Martin Beckett

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;
}
3
Dima Maligin
#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;
}
3
Dmoonleo

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 を参照してください。

enter image description 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;
}

以下のように出力します。

enter image description here

0
Jayhello