Выведите значения матрицы A (Mat) в OpenCV C++


Я хочу сбросить значения матрицы в OpenCV на консоль с помощью cout. Я быстро узнал, что я не понимаю систему типов OpenvCV и шаблоны C++ достаточно хорошо, чтобы выполнить эту простую задачу.

может ли читатель опубликовать (или указать мне) небольшую функцию или фрагмент кода, который печатает коврик?

с уважением, Аарон

PS: код, который использует более новый интерфейс c++ Mat в отличие от старого интерфейса CvMat, является предпочтительным.

4 51

4 ответа:

смотрите первый ответ на доступ к матричному элементу в объекте" Mat " (а не в объекте CvMat) в OpenCV C++
Затем просто переберите все элементы в cout << M.at<double>(0,0);, а не просто 0,0

или еще лучше новый интерфейс C++ (спасибо SSteve)

cv::Mat M;

cout << "M = "<< endl << " "  << M << endl << 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;
}

Я думаю, используя matrix.at<type>(x,y) это не самый лучший способ, чтобы выполнить итерации через объект мат! Если я правильно помню 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;
}

Если вы используете 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;

вывод как показано ниже, вы можете увидеть его более читаемым, см. здесь для получения дополнительной информации.

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