>백엔드 개발 >C++ >대형 OpenCV 매트를 효율적으로 로드하려면 어떻게 해야 합니까?

대형 OpenCV 매트를 효율적으로 로드하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-02 00:24:09124검색

How Can I Efficiently Load Large OpenCV Mats?

OpenCV에서 대형 매트의 효율적인 로딩: 종합 가이드

광범위한 메모리 집약적 Mat 객체를 처리할 때 로딩 효율성은 다음과 같습니다. 최고의. OpenCV의 FileStorage 방법은 간단한 접근 방식을 제공하지만 항상 충분하지는 않습니다.

대안: 바이너리 데이터 로드

성능을 크게 향상하려면 Mat 객체를 다음 위치에 저장하고 로드하는 것을 고려하세요. 원시 바이너리 형식. 이는 FileStorage와 관련된 오버헤드를 우회하여 상당한 시간 절약으로 이어집니다.

matwrite 및 matread 함수 구현

바이너리 로딩을 구현하려면 matwrite 및 matread 함수를 활용하세요.

void matwrite(const string& filename, const Mat& mat) { ... }
Mat matread(const string& filename) { ... }

공연 비교

벤치마크는 FileStorage와 바이너리 로딩 간의 로딩 속도에 큰 차이가 있음을 보여줍니다.

Using FileStorage: 5523.45 ms
Using Raw:         50.0879 ms

Using FileStorage: (out of memory)
Using Raw:         197.381 ms

추가 참고 사항

  • 성능 측정은 디버그가 아닌 릴리스 모드에서 수행되어야 합니다. 모드.
  • 메모리 제한으로 인해 FileStorage를 사용하여 대용량 Mat를 로드하지 못할 수 있지만 바이너리 로드는 실행 가능한 솔루션을 제공합니다.

코드 예

다음 코드는 저장, 로드 및 성능을 위해 matwrite 및 matread를 사용하는 방법을 보여줍니다. 테스트:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

using namespace std;
using namespace cv;

int main() {
    // Save randomly generated data
    Mat m(1024*256, 192, CV_8UC1);
    randu(m, 0, 1000);

    matwrite("raw.bin", m);

    // Load saved matrix
    double tic = getTickCount();
    Mat m1 = matread("raw.bin");

    // Calculate loading time
    double toc = (getTickCount() - tic) * 1000. / getTickFrequency();
    cout << "Using Raw: " << toc << " ms" << endl;
}

대형 Mat 객체에 바이너리 로딩을 사용하면 효율성을 크게 높이고 로딩 시간을 줄여 OpenCV 애플리케이션을 최적화하여 최적의 성능을 얻을 수 있습니다.

위 내용은 대형 OpenCV 매트를 효율적으로 로드하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.