>  기사  >  백엔드 개발  >  OpenCV에서 Mat 개체를 배열이나 벡터로 변환하는 방법은 무엇입니까?

OpenCV에서 Mat 개체를 배열이나 벡터로 변환하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-26 13:48:02193검색

How to Convert a Mat Object to an Array or Vector in OpenCV?

OpenCV에서 Mat를 배열로 변환

OpenCV는 다양한 데이터 구조 간 변환을 위한 다양한 방법을 제공합니다. 이 글에서는 Mat 객체를 배열이나 벡터로 변환하는 것에 중점을 둘 것입니다.

Mat에서 배열로 직접 변환

연속 Mat의 경우, 데이터는 메모리에 연속적으로 저장되므로 해당 데이터를 1D 배열로 직접 액세스할 수 있습니다.

<code class="cpp">cv::Mat mat;
// ...
std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous()) {
    array = mat.data;
}</code>

2D 배열로 변환

비연속 Mat의 경우 , 해당 데이터를 행별로 검색하여 2D 배열에 저장할 수 있습니다.

<code class="cpp">cv::Mat mat;
// ...
std::vector<std::vector<uchar>> array(mat.rows);
for (int i = 0; i < mat.rows; ++i) {
    array[i] = std::vector<uchar>(mat.cols * mat.channels());
    array[i] = mat.ptr<uchar>(i);
}</code>

벡터로 변환

C 표준 라이브러리의 벡터를 사용하는 경우 다음 접근 방식을 사용할 수 있습니다.

<code class="cpp">cv::Mat mat;
// ...
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의 ROI(관심 영역)에서 생성된 행렬은 연속적이지 않을 수 있습니다.

이 코드 조각은 데이터 연속성의 차이점을 보여줍니다.

<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3);
cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100));

std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true
std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>

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

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