> 백엔드 개발 > C++ > OpenCV Mat 객체를 C 배열 또는 벡터로 효율적으로 변환하려면 어떻게 해야 합니까?

OpenCV Mat 객체를 C 배열 또는 벡터로 효율적으로 변환하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-10-26 14:08:03
원래의
856명이 탐색했습니다.

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

OpenCV에서 매트를 배열/벡터로 변환

OpenCV에서 이미지 데이터에 액세스하고 조작하는 것은 다양한 이미지 처리 작업에 매우 중요합니다. 일반적인 요구 사항 중 하나는 이미지나 행렬을 나타내는 Mat 개체를 배열이나 벡터로 변환하는 것입니다.

배열로 변환

Mat 개체의 메모리가 연속적입니다. 즉, 모든 데이터가 연속적으로 저장된다는 의미입니다. 다음 코드를 사용하여 1D 배열을 직접 얻을 수 있습니다.

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

여기서 mat는 Mat 객체이고 array는 변환된 배열인 .rows, .cols입니다. , .channels()는 이미지 크기와 채널 수를 나타내며 .data는 이미지 데이터에 대한 포인터입니다.

벡터로 변환

연속 매트, 데이터를 행 단위로 검색해야 합니다. 다음은 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를 사용하면 변환을 단순화할 수 있습니다.

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    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>
로그인 후 복사

Mat 데이터 연속성

효율적인 변환을 위해서는 Mat 데이터 연속성에 대한 이해가 필수적입니다. 다음은 몇 가지 핵심 사항입니다.

  • imread(), clone() 또는 생성자를 사용하여 생성된 Mat는 항상 연속적입니다.
  • Mats는 데이터를 빌릴 때만 비연속적이 됩니다. 기존 매트에서 가져옵니다(단일 행 또는 전체 원래 너비의 여러 행을 차용하는 경우 제외).

예를 들어 다음 코드 조각에서:

<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>
로그인 후 복사

이미지는 연속적입니다. Mat는 imread()를 사용하여 생성되었기 때문에, sub_image는 이미지 Mat의 일부를 참조하기 때문에 비연속적입니다.

위 내용은 OpenCV Mat 객체를 C 배열 또는 벡터로 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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