development

OpenCV C ++에서 (Mat) 행렬의 값을 인쇄합니다.

big-blog 2021. 1. 7. 20:37
반응형

OpenCV C ++에서 (Mat) 행렬의 값을 인쇄합니다.


cout을 사용하여 OpenCV의 행렬 값을 콘솔에 덤프하고 싶습니다. 나는 OpenvCV의 유형 시스템이나 C ++ 템플릿을이 간단한 작업을 수행하기에 충분히 잘 이해하지 못한다는 것을 금방 알게되었습니다.

독자가 매트를 인쇄하는 작은 기능이나 코드 스 니펫을 게시 (또는 안내해 주실 수 있습니까)?

안부, Aaron

추신 : 이전 CvMat 인터페이스와 달리 최신 C ++ Mat 인터페이스를 사용하는 코드가 우선적입니다.


OpenCV C ++의 "Mat"개체 (CvMat 개체가 아님)에서 행렬 요소 액세스에 대한 첫 번째 답변을 참조하십시오.
그런 다음 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)것이 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;
}

opencv3를 사용하는 경우 다음과 같이 Mat를 인쇄 할 수 있습니다 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;
}

아래와 같이 출력 :

여기에 이미지 설명 입력

참조 URL : https://stackoverflow.com/questions/7970988/print-out-the-values-of-a-mat-matrix-in-opencv-c

반응형