성능 향상: 바이너리 파일을 사용하여 대규모 Mat 개체를 효율적으로 로드
대량 Mat 개체를 메모리에 로드하는 것은 다양한 OpenCV 애플리케이션에 매우 중요합니다. FileStorage 방법은 일반적인 접근 방식이지만 대규모 데이터 세트를 처리하는 데 가장 효율적인 옵션은 아닐 수 있습니다. 여기에 주목할 만한 성능 향상을 약속하는 대체 기술이 있습니다.
바이너리 형식: 속도와 효율성의 핵심
비결은 에서 이미지를 저장하고 로드하는 데 있습니다. 바이너리 형식. matwrite 및 matread 기능을 사용하면 FileStorage 방법에 비해 놀라운 속도 향상을 얻을 수 있습니다.
벤치마킹 결과: 차이의 세계
250K 행 x 192 열 이미지로 테스트한 결과 (CV_8UC1), 성능 차이가 현저합니다:
더 큰 이미지(1M 행) x 192개 열), FileStorage 메소드가 다음으로 인해 실패했습니다. 메모리 부족 오류가 발생했지만 바이너리 모드는 단 197.381ms 만에 문제를 쉽게 처리했습니다.
코드 구현: 단순화되고 효과적
다음은 matwrite 및 matread 기능과 함께 성능 향상을 보여주는 테스트:
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& filename) { ifstream fs(filename, fstream::binary); int rows, cols, type, channels; fs.read((char*)&rows, sizeof(int)); // rows fs.read((char*)&cols, sizeof(int)); // cols fs.read((char*)&type, sizeof(int)); // type fs.read((char*)&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 중국어 웹사이트의 기타 관련 기사를 참조하세요!