[c++] 영상 분할 및 객체 추출
이번에는 OpenCV와 C++를 사용하여 영상을 분할하고 객체를 추출하는 방법에 대해 알아보겠습니다.
1. 영상 분할
영상 분할은 주로 픽셀의 세부 정보를 기반으로 특정 영역을 구분하는 작업을 말합니다. 이를 위해 자주 사용되는 기술 중 하나는 영역 기반 분할입니다. OpenCV를 사용하여 영상에 적용되는 각 영역의 윤곽선을 찾을 수 있습니다:
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("input_image.jpg");
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
cv::Mat binary;
cv::threshold(gray, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 윤곽선 그리기
cv::Mat contourImage = cv::Mat::zeros(image.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++) {
cv::drawContours(contourImage, contours, i, cv::Scalar(0, 255, 0), 2);
}
cv::imshow("Contours", contourImage);
cv::waitKey(0);
return 0;
}
위의 코드는 입력 이미지에서 윤곽선을 찾아서 표시하는 간단한 예시입니다.
2. 객체 추출
윤곽선을 찾은 후, 특정 객체를 식별하고 추출할 수 있습니다. OpenCV를 사용하여 객체를 추출하는 예제 코드는 다음과 같습니다:
std::vector<cv::Rect> boundRect(contours.size());
for (size_t i = 0; i < contours.size(); i++) {
boundRect[i] = cv::boundingRect(contours[i]);
cv::rectangle(image, boundRect[i], cv::Scalar(255, 0, 0), 2);
}
cv::imshow("Objects", image);
cv::waitKey(0);
여기서는 cv::boundingRect
함수를 사용하여 윤곽선 주변에 사각형을 그리고, 이를 통해 객체를 추출하고 시각화하는 방법을 보여줍니다.
결론
이렇게 OpenCV와 C++를 사용하여 영상을 분할하고 객체를 추출할 수 있습니다. 이를 통해 영상 처리 및 컴퓨터 비전 분야에서 다양한 응용 프로그램을 개발할 수 있습니다.
더 많은 정보를 원하시면 OpenCV 공식 문서를 참고하시기 바랍니다.