opencv
얼룩 감지
수색…
원형 얼룩 탐지
이 예제는 그레이 스케일 이미지에서 원형 얼룩을 찾는 방법을 보여줍니다. 얼룩의 원형도 평가는 윤곽선의 면적과 둘레 (아크 길이)를 사용하여 수행됩니다. 중심점은 형상의 모멘트를 사용하여 계산됩니다.
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include "opencv/cxcore.h"
using namespace cv;
int main(int argc, char** argv)
{
Mat img = imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat resultImg;
cvtColor(img, resultImg, CV_GRAY2BGR);
// threshold the image with gray value of 100
Mat binImg;
threshold(img, binImg, 100, 255, THRESH_BINARY);
// find the contours
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binImg, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
if(contours.size() <= 0)
{
printf("no contours found");
return 0;
}
// filter the contours
vector<vector<Point>> filteredBlobs;
Mat centers = Mat::zeros(0,2,CV_64FC1);
for(int i = 0; i < contours.size(); i++)
{
// calculate circularity
double area = contourArea(contours[i]);
double arclength = arcLength(contours[i], true);
double circularity = 4 * CV_PI * area / (arclength * arclength);
if(circularity > 0.8)
{
filteredBlobs.push_back(contours[i]);
//calculate center
Moments mu = moments(contours[i], false);
Mat centerpoint = Mat(1,2,CV_64FC1);
centerpoint.at<double>(i,0) = mu.m10 / mu.m00; // x-coordinate
centerpoint.at<double>(i,1) = mu.m01 / mu.m00; // y-coordinate
centers.push_back(centerpoint);
}
}
if(filteredBlobs.size() <= 0)
{
printf("no circular blobs found");
return 0;
}
drawContours(resultImg, filteredBlobs, -1, Scalar(0,0,255), CV_FILLED, 8);
imshow("Blobs",resultImg);
waitKey(0);
return 0;
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow