ISP(with opencv) c++ #3

천동민·2023년 6월 5일
0
post-thumbnail

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;
}

0개의 댓글