Выведите значения матрицы A (Mat) в OpenCV C++
Я хочу сбросить значения матрицы в OpenCV на консоль с помощью cout. Я быстро узнал, что я не понимаю систему типов OpenvCV и шаблоны C++ достаточно хорошо, чтобы выполнить эту простую задачу.
может ли читатель опубликовать (или указать мне) небольшую функцию или фрагмент кода, который печатает коврик?
с уважением, Аарон
PS: код, который использует более новый интерфейс c++ Mat в отличие от старого интерфейса CvMat, является предпочтительным.
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;
вывод как показано ниже, вы можете увидеть его более читаемым, см. здесь для получения дополнительной информации.
но в большинстве случаев нет необходимости выводить все данные в 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; }
выход, как показано ниже: