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 데이터 연속성을 이해하는 것이 중요합니다. 주목해야 할 핵심 사항은 다음과 같습니다.
위 내용은 OpenCV Mat를 배열 또는 벡터로 효율적으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!