#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <io.h>
#include <direct.h>
#include<Windows.h>
using namespace std;
using namespace cv;
/*采用cvFindContours提取轮廓,并过滤掉小面积轮廓,最后将轮廓保存*/
RNG rng;
static int getContoursByCplus(string Imgname, double minarea, double whRatio)
{
cv::Mat src, dst, canny_output;
/// Load source image and convert it to gray
src = imread(Imgname, 0);
if (!src.data)
{
std::cout << "read data error!" << std::endl;
return -1;
}
blur(src, src, Size(3, 3));
//the pram. for findContours,
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Detect edges using canny
Canny(src, canny_output, 80, 255, 3);
/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
//CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE
double maxarea = 0;
int maxAreaIdx = 0;
for (int i = 0; i < contours.size(); i++)
{
double tmparea = fabs(contourArea(contours[i]));
if (tmparea > maxarea)
{
maxarea = tmparea;
maxAreaIdx = i;
continue;
}
if (tmparea < minarea&&tmparea>20000)
{
//删除面积小于设定值的轮廓
contours.erase(contours.begin() + i);
std::wcout << "delete a small area" << std::endl;
continue;
}
//计算轮廓的直径宽高
Rect aRect = boundingRect(contours[i]);
if ((aRect.width / aRect.height) < whRatio)
{
//删除宽高比例小于设定值的轮廓
contours.erase(contours.begin() + i);
std::wcout << "delete a unnomalRatio area" << std::endl;
continue;
}
Mat hsv, mask;
Mat roi = src(aRect);
Mat person=roi.clone();
imshow("hsv", roi);
drawContours(person,contours[i],i,Scalar(255),0);