void InRobotVision::NestDetect(Mat frame)
{
/*用于程序处理的中间变量*/
Mat Image;
/*用于存储鸟巢模板的灰度直方图*/
MatND hist;
/*鸟巢模板的灰度直方图灰度级中灰度最高位置*/
double img_max_val;
/*如果读入图像失败,输出报警信息*/
if (frame.empty())
{
fprintf(stderr, "Can not load image \n");
exit(-1);
}/*if (frame.empty())条件语句至此结束*/
/*用于作对比的鸟巢模板图像*/
Mat img = imread("E:\\无人机线路巡检\\鸟窝.jpg");
/*计算鸟巢模板的灰度直方图,并返回灰度最高的位置,也就是某一灰度级最多的位置*/
calcImgHist(img, hist, img_max_val);
/*将输入的图像缩放到标准尺寸640*480*/
resize(frame, frame, Size(640, 480));
/*将图像从RGB图像转为灰度图*/
cvtColor(frame, Image, CV_BGR2GRAY);
/*对图像滤波,以消除噪声*/
blur(Image, Image, Size(3, 3));
/*提取图像的边缘,将图像转为二值图像*/
Canny(Image, frame_img, 100, 200);
/*形态学闭操作,先膨胀后腐蚀,填补前景中的细小空洞*/
dilate(frame_img, frame_img, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
erode(frame_img, frame_img, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
/*用于存储输入图像的轮廓信息*/
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
/*查找轮廓*/
findContours(frame_img, contours, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
/*生成一副白底且与源图像同尺寸的图像,并将轮廓画到该图像上*/
Mat result(frame.size(), CV_8U, Scalar(255));
/*画出全部轮廓到一副图像上*/
drawContours(result, contours, -1, Scalar(0), 2);
/*存储轮廓的相似多边形*/
std::vector<cv::Point> approx;
/*InRobotVision类的公共变量,用于main文件显示结果图像*/
frame_dst = frame.clone();