opencv로 윤곽선 검출 및 그리기
원본 이미지
이진화 과정
for (size_t i = 0; i < width* height; i++)
{
pDataGray[i] < 230 ? pDataGray[i] = 255 : pDataGray[i] = 0;
}
윤곽선 찾기 -> findContours() 함수 이용
윤곽선 그리기 -> drawContours() 함수 이용
cv::findContours(gray_img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
gray_img는 그레이스케일 이미지이어야 한다
앞선 이진화 과정에서 0과 255로 이미지를 표현하여 윤곽선을 찾는데 더 좋은 성능을 갖도록 한다
contours -> 윤곽선 좌표 정보를 저장할 변수
hierarchy -> 윤곽선의 계층 구조 정보를 저장할 변수
#include "../Common/Common.h"
#include "ISP.h"
void main()
{
ISP _isp;
string fileDir = "../thirdparty/opencv_470/sources/samples/data/";
string fileName = fileDir + "shapes.jpg";
Mat color_img = cv::imread(fileName, cv::ImreadModes::IMREAD_COLOR);
uchar* pDataColor = color_img.data;
size_t width = color_img.cols;
size_t height = color_img.rows;
//#1. Convert Color To Gray
Mat gray_img = Mat::zeros(height, width, CV_8UC1);
uchar* pDataGray = gray_img.data;
_isp.Convert_BGR2GRAY(pDataColor, width, height, pDataGray);
for (size_t i = 0; i < width* height; i++)
{
pDataGray[i] < 230 ? pDataGray[i] = 255 : pDataGray[i] = 0;
} // 이진화 과정
// 윤곽선 찾기
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(gray_img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 윤곽선 그리기
RNG rng(12345);
cv::Mat contourImage = cv::Mat::zeros(gray_img.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
drawContours(contourImage, contours, (int)i, color, 2, LINE_8, hierarchy, 0);
}
return;
}