> 백엔드 개발 > C++ > 본문

OpenCV Mat를 배열 또는 벡터로 효율적으로 변환하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-27 03:32:30
원래의
232명이 탐색했습니다.

How to Efficiently Convert OpenCV Mat to an Array or Vector?

OpenCV에서 Mat를 배열 또는 벡터로 변환

OpenCV 행렬 연산에서 Mat를 배열 또는 벡터로 변환해야 하는 경우가 있습니다. . 이 문서에서는 OpenCV의 강력한 기능을 활용하여 이러한 변환을 수행하기 위한 포괄적인 가이드를 제공합니다.

배열로 직접 변환

Mat 개체 매트가 연속 메모리를 보유하는 경우 해당 데이터는 1차원 배열로 직접 검색:

<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous())
    array = mat.data;</code>
로그인 후 복사

행 기반 배열로 변환

메모리가 연속적이지 않은 경우 행에서 데이터를 얻을 수 있음 행별로 결과적으로 2D 배열이 생성됩니다.

<code class="cpp">uchar **array = new uchar*[mat.rows];
for (int i = 0; i < mat.rows; ++i)
    array[i] = new uchar[mat.cols * mat.channels()];

for (int i = 0; i < mat.rows; ++i)
    array[i] = mat.ptr<uchar>(i);</code>
로그인 후 복사

대체 벡터 변환

std::Vector를 사용하면 Mat를 배열로 변환하는 대체 접근 방식이 제공됩니다.

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices
    array.assign(mat.data, mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i) + mat.cols * mat.channels());
    }
}</code>
로그인 후 복사

다른 유형의 벡터로 변환

CV_32F와 같은 다른 데이터 유형을 사용하는 OpenCV Mat의 경우 변환 프로세스는 유사합니다.

<code class="cpp">std::vector<float> array;
if (mat.isContinuous()) {
    // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices
    array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels());
    }
}</code>
로그인 후 복사

Mat 데이터 연속성의 이해

효과적인 변환을 수행하려면 Mat 데이터 연속성을 이해하는 것이 중요합니다. 주목해야 할 핵심 사항은 다음과 같습니다.

  • imread(), clone() 또는 생성자를 통해 생성된 Mat는 본질적으로 연속적입니다.
  • 데이터 불연속성은 Mat가 기존 매트(전체 원본 너비와 관련된 특정 시나리오 제외).

위 내용은 OpenCV Mat를 배열 또는 벡터로 효율적으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!