>  기사  >  백엔드 개발  >  OpenCV Mat를 배열 또는 벡터로 효율적으로 변환하는 방법은 무엇입니까?

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

Susan Sarandon
Susan Sarandon원래의
2024-10-27 03:32:30233검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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