OpenCV에서findContours 함수 사용

2876 단어 OpenCV
2치 이미지에서 객체의 컨투어를 찾습니다.
OpenCV의 함수findContours()는 의 객체 아웃라인에 사용되는 두 가지 형태입니다.
첫 번째:
void findContours( InputOutputArray image, OutputArrayOfArrays contours,                               int mode, int method, Point offset=Point());
두 번째:
void findContours( InputOutputArray image, OutputArrayOfArrays contours,                               OutputArray hierarchy, int mode,                               int method, Point offset=Point());
매개변수:
contours: 찾은 각 윤곽입니다
mode :CV_RETR_EXTERNAL에서 찾은 컨투어에는 작은 컨투어(구멍)가 없습니다. CVRETR_LIST에서 찾은 컨투어에 작은 컨투어를 포함할 수 있습니다.
hierarchy: 차원 구조, 윤곽이 같은 등급의 앞뒤 윤곽을 저장한 색인, 서로 다른 등급의 아버지 윤곽과 아이 윤곽의 색인
method:CV_CHAIN_APPROX_NONE 아웃라인의 모든 픽셀 점 가져오기
코드: 실행 환경(VS2012 + OpenCV2.4)
#include "highgui.h"
#include "imgproc/imgproc.hpp"

int main()
{
	cv::Mat image = cv::imread("D:/Development/OpenCV/images/binaryGroup.bmp" , 0) ;
	std::vector<:vector>> contours ;
	// 
	cv::findContours(image , contours , 
		CV_RETR_EXTERNAL , CV_CHAIN_APPROX_NONE) ;
	cv::Mat result(image.size() , CV_8U , cv::Scalar(255)) ;
	cv::drawContours(result , contours ,
		-1 , cv::Scalar(0) , 2) ;
	cv::imshow("resultImage" , result) ;
	
	// 
	std::vector<:vector>> allContours ;
	cv::Mat allContoursResult(image.size() , CV_8U , cv::Scalar(255)) ;
	cv::findContours(image , allContours ,
		CV_RETR_LIST , CV_CHAIN_APPROX_NONE) ;
	cv::drawContours(allContoursResult , allContours ,-1 ,
		cv::Scalar(0) , 2) ;
	cv::imshow("allContours" , allContoursResult) ;

	// 
	std::vector<:vec4i> hierarchy ;
	cv::findContours(image , contours , hierarchy , CV_RETR_TREE ,
		CV_CHAIN_APPROX_NONE) ;

	cv::waitKey(0) ;
	return 0 ;

1, 포위 대상의 수직 행렬 가져오기
cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
cv::rectangle(result,r0,cv::Scalar(0),2);

2. 포위 대상의 가장 작은 원을 얻는다
cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
cv::rectangle(result,r0,cv::Scalar(0),2);

3. 포위 대상의 다각형 가져오기
// testing the approximate polygon
std::vector<:point> poly;
cv::approxPolyDP(cv::Mat(contours[2]),poly,
5, // accuracy of the approximation
true); // yes it is a closed shape

4, 포위 대상의 볼록 패키지 획득
// testing the convex hull
std::vector<:point> hull;
cv::convexHull(cv::Mat(contours[3]),hull);

5. 각 대상의 양심을 얻는다
itc= contours.begin();
while (itc!=contours.end()) {
// compute all moments
cv::Moments mom= cv::moments(cv::Mat(*itc++));
// draw mass center
cv::circle(result,
// position of mass center converted to integer
cv::Point(mom.m10/mom.m00,mom.m01/mom.m00),
2,cv::Scalar(0),2); // draw black dot
}

참고:findContours() 함수는 이미지를 변경합니다.

좋은 웹페이지 즐겨찾기