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 데이터 연속성에 대한 이해가 필수적입니다. 다음은 몇 가지 핵심 사항입니다.
예를 들어 다음 코드 조각에서:
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!