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+윤곽 추출 과 선별 방식 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
opencv 3/C+윤곽 추출 및 선별 방식find Contours()는"정지점 이 발생 했 습 니 다"등 오 류 를 보고 하기 도 합 니 다.y 의 효과 적 인 해결 방법 은 다음 과 같 습 니 다. drawContours 윤곽 그리 기 예시: opencv...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.