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