opencv 3/C+윤곽 추출 및 선별 방식

윤곽 추출
findContours 윤곽 발견

findContours(
InputOutputArray binImg, //  8bit  ,0      , 0     1;(      )
 OutputArrayOfArrays contours,//         
OutputArray, hierachy//        
int mode, //       (RETR_TREE )
int method,//    (CHAIN_APPROX_SIMPLE )
Point offset=Point()//       (      (0, 0))
)
[오류 신고 문제]
find Contours()는"정지점 이 발생 했 습 니 다"등 오 류 를 보고 하기 도 합 니 다.y 의 효과 적 인 해결 방법 은 다음 과 같 습 니 다.
1.vector 를 위해 일정한 공간 을 미리 신청 합 니 다.예 를 들 어

std::vector<std::vector<Point>> contours(500)
2.Debug 버 전 을 Release 버 전 으로 전환 합 니 다.
drawContours 윤곽 그리 기

drawContours(
InputOutputArray binImg, //     
 OutputArrayOfArrays contours,//         
Int contourIdx//     
const Scalar & color,//    
int thickness,//    
int lineType ,//    (  8)
InputArray hierarchy,//     
int maxlevel,//    (0      ,1               )
Point offset=Point()//    
)
예시:

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
 Mat src,dst;
 src = imread("E:/image/image/shape.jpg");
 if(src.empty())
 {
 printf("can not load image 
"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("input", src); dst = Mat::zeros(src.size(), CV_8UC3); blur(src,src,Size(3,3)); cvtColor(src,src,COLOR_BGR2GRAY); Canny(src, src, 20, 80, 3, false); std::vector<std::vector<Point>> contours; std::vector<Vec4i> hierarchy; findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); RNG rng(0); for(int i = 0; i < contours.size(); i++) { Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)); drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0,0)); } namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output",dst); waitKey(); return 0; }


opencv 3 를 사용 할 때(테스트 용 opencv 3.1.0)cv 네 임 스페이스 에 vector 가 없 으 며,opencv 2 에(테스트 용 opencv 2.4.10)존재 합 니 다.각 헤더 파일 을 살 펴 보면 다음 과 같 습 니 다:
opencv.hpp 헤더 파일 에는 core.hpp(\#include"opencv 2/core.hpp")가 포함 되 어 있 습 니 다.
opencv 2 의 core.hpp 에는

........
#include <map>
#include <new>
#include <string>
#include <vector>
.......
등 두 파일 이지 만 opencv 3 의 core.hpp 에서 이 포함 항목 을 삭제 합 니 다.
따라서 opencv 3 를 사용 할 때 cv 네 임 스페이스 에 vector 가 없습니다.
opencv 2.4.10 을 사용 하면 다음 과 같이 쓸 수 있 습 니 다.

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
 Mat src,dst;
 src = imread("E:/image/image/shape.jpg");
 if(src.empty())
 {
 printf("can not load image 
"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("input", src); dst = Mat::zeros(src.size(), CV_8UC3); blur(src,src,Size(5,5)); Canny(src, src, 20, 80, 3, false); vector<vector<Point>>contours; vector<Vec4i> hierarchy; findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); RNG rng(0); for(int i = 0; i < contours.size(); i++) { Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)); drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0,0)); } namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output",dst); waitKey(); return 0; }
윤곽 외 사각형 상자 그리 기
윤곽 바깥 모양 을 그 리 는 함수:
cv::boundingRect(InputArray points)사각형 그리 기(윤곽 주위 최소 사각형 왼쪽 상단 점 과 오른쪽 하단 점)
cv::minareaRect(InputArray points)윤곽 주위 최소 회전 사각형 그리 기
cv::minEnclosingCircle(InputArray points,Point2f¢er,float&radius)//윤곽 주위 최소 원형 그리 기
cv:fitEllipe(InputArray points)윤곽 주위 최소 타원 그리 기
윤곽 바깥 사각형 상자 그리 기:

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
 Mat src,dst;
 src = imread("E:/image/shape.jpg");
 if(src.empty())
 {
 printf("can not load image 
"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("input", src); dst = Mat::zeros(src.size(), CV_8UC3); std::vector<std::vector<Point>>contours; std::vector<Vec4i> hierarchy; blur(src,src,Size(3,3)); cvtColor(src,src,COLOR_BGR2GRAY); Canny(src, src, 20, 80, 3, false); findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); RNG rng(0); std::vector<std::vector<Point>> contoursPloy(contours.size()); std::vector<RotatedRect> minRects(contours.size()); for(int i = 0; i < contours.size(); i++) { minRects[i] = minAreaRect(Mat(contours[i])); Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)); drawContours(dst, contoursPloy, i, color, 1,8,std::vector<Vec4i>(), 0, Point(0, 0)); Point2f rectPoints[4]; minRects[i].points(rectPoints); for (int j = 0; j < 4; j++) { line(dst, rectPoints[j], rectPoints[(j+1)%4], color, 1, 8, 0); } } namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output",dst); waitKey(); return 0; }


윤곽 선별

moments(
InputArray array,//    
bool  binaryImage=false //       
)
contourArea(
InputArray contour,//      
bool  oriented//     (  false)
)

arcLength(
InputArray curve,//    
bool  closed//         
)
윤곽 필터 예시:
윤곽 의 면적 과 길이 특징 을 사용 하여 윤곽 을 선별 한 후 외 접 사각형 으로 선별 한 윤곽 상 자 를 선택 합 니 다.

#include<opencv2/opencv.hpp>
using namespace cv;

void trackBar(int,void*);

Mat src,dst;
std::vector<std::vector<Point>>contours;
int area = 0, length = 0;
int main()
{

 src = imread("E:/image/shape.jpg");
 if(src.empty())
 {
 printf("can not load image 
"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("input", src); dst = Mat::zeros(src.size(), CV_8UC3); std::vector<Vec4i> hierarchy; blur(src,dst,Size(3,3)); cvtColor(dst,dst,COLOR_BGR2GRAY); Canny(dst, dst, 20, 80, 3, false); findContours(dst, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); namedWindow("output", CV_WINDOW_AUTOSIZE); createTrackbar("area:", "output", &area,150,trackBar); createTrackbar("length:", "output", &length,150,trackBar); waitKey(); return 0; } void trackBar(int,void*) { Mat src1 = src.clone(); RNG rng(0); std::vector<std::vector<Point>> contoursPloy(contours.size()); std::vector<RotatedRect> minRects(contours.size()); for(int i = 0; i < contours.size(); i++) { if(contourArea(contours[i]) > area && arcLength(contours[i], false) > length) { minRects[i] = minAreaRect(Mat(contours[i])); Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)); //drawContours(dst, contoursPloy, i, color, 1,8,vector<Vec4i>(), 0, Point(0, 0)); Point2f rectPoints[4]; minRects[i].points(rectPoints); for (int j = 0; j < 4; j++) { line(src1, rectPoints[j], rectPoints[(j+1)%4], color, 2, 8, 0); } } } imshow("output",src1); src1 = src; }


이상 의 opencv 3/C+윤곽 추출 과 선별 방식 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기