2011-11-01 43 views
46

Tôi muốn kết xuất giá trị của ma trận trong OpenCV với bàn điều khiển bằng cách sử dụng cout. Tôi nhanh chóng biết được rằng tôi không hiểu hệ thống kiểu của OpenvCV cũng như các mẫu C++ cũng đủ để thực hiện nhiệm vụ đơn giản này.In ra các giá trị của ma trận (Mat) trong OpenCV C++

Người đọc có vui lòng đăng (hoặc chỉ cho tôi) một đoạn mã nhỏ hoặc chức năng in Mat?

Kính trọng, Aaron

PS: Mã có sử dụng giao diện C++ Mat mới hơn như trái ngược với giao diện CvMat cũ là ưu đãi.

Trả lời

68

Xem câu trả lời đầu tiên Accesing a matrix element in the "Mat" object (not the CvMat object) in OpenCV C++
Sau đó chỉ cần lặp qua tất cả các yếu tố trong cout << M.at<double>(0,0); thay vì chỉ 0,0

Hoặc tốt hơn vẫn với new C++ interface (nhờ SSteve)

cv::Mat M; 

cout << "M = "<< endl << " " << M << endl << endl; 
+1

Xem thêm [phần này của hướng dẫn] (http://opencv.itseez.com/doc/tutorials/core/mat%20-%20the%20basic%20image%20container /mat%20-%20the%20basic%20image%20container.html#print-out-formatting) – SSteve

+1

Brilliant. Tôi nên thuê một Mat để cout ở nơi đầu tiên chỉ để xem nếu ai đó đã thực hiện <<. Một chút thử nghiệm và sự tin tưởng sẽ mang lại cho tôi. – ahoffer

+0

Tôi vừa hỏi [một câu hỏi về điều này] (http://stackoverflow.com/questions/10011797/opencv-2-1-where-is-ostream-operator-for-cvmat). Nhà điều hành ostream << có sẵn trong 2.1 và công cụ này được ghi chép ở đâu? – juanchopanza

3
#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

Tôi nghĩ rằng việc sử dụng matrix.at<type>(x,y) không phải là cách tốt nhất để lặp lại máng đối tượng Mat! Nếu tôi nhớ lại chính xác matrix.at<type>(x,y) sẽ lặp lại từ đầu ma trận mỗi lần bạn gọi nó (có thể tôi đã sai). tôi sẽ đề nghị sử dụng 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; 
} 
Các vấn đề liên quan