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

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

Susan Sarandon
풀어 주다: 2024-12-05 16:09:16
원래의
653명이 탐색했습니다.

How Can I Efficiently Load Large OpenCV Mat Objects into Memory?

성능 향상: 바이너리 파일을 사용하여 대규모 Mat 개체를 효율적으로 로드

대량 Mat 개체를 메모리에 로드하는 것은 다양한 OpenCV 애플리케이션에 매우 중요합니다. FileStorage 방법은 일반적인 접근 방식이지만 대규모 데이터 세트를 처리하는 데 가장 효율적인 옵션은 아닐 수 있습니다. 여기에 주목할 만한 성능 향상을 약속하는 대체 기술이 있습니다.

바이너리 형식: 속도와 효율성의 핵심

비결은 에서 이미지를 저장하고 로드하는 데 있습니다. 바이너리 형식. matwritematread 기능을 사용하면 FileStorage 방법에 비해 놀라운 속도 향상을 얻을 수 있습니다.

벤치마킹 결과: 차이의 세계

250K 행 x 192 열 이미지로 테스트한 결과 (CV_8UC1), 성능 차이가 현저합니다:

  • FileStorage: 5523.45ms
  • 바이너리 형식: 50.0879ms

더 큰 이미지(1M 행) x 192개 열), FileStorage 메소드가 다음으로 인해 실패했습니다. 메모리 부족 오류가 발생했지만 바이너리 모드는 단 197.381ms 만에 문제를 쉽게 처리했습니다.

코드 구현: 단순화되고 효과적

다음은 matwritematread 기능과 함께 성능 향상을 보여주는 테스트:

void matwrite(const string& filename, const Mat& mat)
{
    ofstream fs(filename, fstream::binary);
    fs.write((char*)&mat.rows, sizeof(int));    // rows
    fs.write((char*)&mat.cols, sizeof(int));    // cols
    fs.write((char*)&mat.type, sizeof(int));        // type
    fs.write((char*)&mat.channels, sizeof(int));    // channels
    if (mat.isContinuous())
    {
        fs.write(mat.ptr<char>(0), (mat.dataend - mat.datastart));
    }
    else
    {
        int rowsz = CV_ELEM_SIZE(mat.type) * mat.cols;
        for (int r = 0; r < mat.rows; ++r)
        {
            fs.write(mat.ptr<char>(r), rowsz);
        }
    }
}

Mat matread(const string&amp; filename)
{
    ifstream fs(filename, fstream::binary);
    int rows, cols, type, channels;
    fs.read((char*)&amp;rows, sizeof(int));         // rows
    fs.read((char*)&amp;cols, sizeof(int));         // cols
    fs.read((char*)&amp;type, sizeof(int));         // type
    fs.read((char*)&amp;channels, sizeof(int));     // channels
    Mat mat(rows, cols, type);
    fs.read((char*)mat.data, CV_ELEM_SIZE(type) * rows * cols);
    return mat;
}
로그인 후 복사

결론: 새로운 수준의 성능 잠금 해제

바이너리 파일 형식을 채택하면 다음과 같은 경우 상당한 성능 이점을 얻을 수 있습니다. 큰 Mat 객체를 메모리에 로드합니다. 이 기술을 사용하면 로딩 시간을 대폭 줄일 수 있어 애플리케이션이 대규모 데이터세트를 보다 효율적으로 사용할 수 있습니다.

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿