-
2022-04-14 09:38:53
haarcascade_frontalface_alt2.xml 文件在安装 Opencv 环境时应该已经下载,可以在安装目录查找,以 Windows 为例,在 opencv\sources\data\haarcascades\ 文件夹下,相关是的使用方法在 opencv\sources\samples\ 文件下,下面的代码是根据 opencv\sources\samples\cpp\facedetect.cpp 修改而来,仅供参考。
#include "opencv2/objdetect.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; void detectAndDraw(Mat& img, CascadeClassifier& cascade, double scale, bool tryflip); int main(int argc, const char** argv) { bool tryflip = false; double scale = 1; string cascadeName = "Opencv\\opencv-4.5.2\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"; CascadeClassifier cascade; if (!cascade.load(cascadeName)) { cerr << "ERROR: Could not load classifier cascade" << endl; return -1; } Mat image = imread("images\\20201020074223525_C420111005003.jpg", IMREAD_COLOR); if (image.empty()) { cout << "Couldn't read image" << endl; return 1; } if (!image.empty()) { detectAndDraw(image, cascade, scale, tryflip); waitKey(0); } return 0; } void detectAndDraw(Mat& img, CascadeClassifier& cascade, double scale, bool tryflip) { double t = 0; vector<Rect> faces, faces2; const static Scalar colors[] = { Scalar(255,0,0), Scalar(255,128,0), Scalar(255,255,0), Scalar(0,255,0), Scalar(0,128,255), Scalar(0,255,255), Scalar(0,0,255), Scalar(255,0,255) }; Mat gray, smallImg; cvtColor(img, gray, COLOR_BGR2GRAY); double fx = 1 / scale; resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR_EXACT); equalizeHist(smallImg, smallImg); t = (double)getTickCount(); cascade.detectMultiScale(smallImg, faces, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH | CASCADE_SCALE_IMAGE, Size(30, 30)); if (tryflip) { flip(smallImg, smallImg, 1); cascade.detectMultiScale(smallImg, faces2, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH | CASCADE_SCALE_IMAGE, Size(30, 30)); for (vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); ++r) { faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height)); } } t = (double)getTickCount() - t; printf("detection time = %g ms\n", t * 1000 / getTickFrequency()); for (size_t i = 0; i < faces.size(); i++) { Rect r = faces[i]; Mat smallImgROI; vector<Rect> nestedObjects; Point center; Scalar color = colors[i % 8]; int radius; double aspect_ratio = (double)r.width / r.height; if (0.75 < aspect_ratio && aspect_ratio < 1.3) { center.x = cvRound((r.x + r.width * 0.5) * scale); center.y = cvRound((r.y + r.height * 0.5) * scale); radius = cvRound((r.width + r.height) * 0.25 * scale); circle(img, center, radius, color, 3, 8, 0); } else rectangle(img, Point(cvRound(r.x * scale), cvRound(r.y * scale)), Point(cvRound((r.x + r.width - 1) * scale), cvRound((r.y + r.height - 1) * scale)), color, 3, 8, 0); } imshow("result", img); }
更多相关内容 -
OpenCV实现halcon卡尺工具
2022-06-10 08:38:15基于OpenCV实现,仿Halcon卡尺工具 -
基于OpenCV实现卡尺工具.rar
2021-11-02 13:12:57基于OpenCV实现仿halcon卡尺工具源码 -
张正友相机标定(OpenCV实现)
2021-03-27 07:30:31使用OpenCV中的calibrateCamera函数进行张正友相机标定,得到相机内参矩阵。 使用OpenCV中的calibrateCamera函数进行张正友相机标定,得到相机内参矩阵。 -
OpenCV实现图像校正功能
2020-12-31 09:17:42先调用 OpenCV 函数实现透视变换,自己编写代码实现透视变换。 3、识别一张倾斜拍摄的纸张,找出轮廓,提取出该纸张的位置 4、 假设你已通过图像处理的算法找到发生形变的纸张的位置,那么对这个倾斜 纸张进行变换,... -
Opencv实现抠图背景图替换功能
2020-09-19 09:23:18主要为大家详细介绍了Opencv实现抠图替换背景图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码-附件资源
2021-03-02 15:06:45利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码-附件资源 -
OpenCV实现人脸图像卡通化openCV.py
2020-12-31 18:22:06OpenCV实现人脸图像卡通化 -
光流法opencv实现
2018-07-14 17:40:23基于opencv的光流法,实现目标的运动检测,修改自其它下载资源,只需该视频文件地址,即可直接运行,注意视频格式和大小 -
数字图像处理基础及OPENCV实现
2018-06-09 18:57:16数字图像处理基础及OPENCV实现.pdf,高清并且带有书签,有需要的可以下载 -
opencv实现水面垃圾检测.rar
2019-07-08 11:03:22opencv实现水面垃圾的检测(对文件夹内的图片进行检测)(附结果图) -
TensorFlow + Opencv 实现简单的图像识别
2019-03-29 16:02:56TensorFlow + Opencv 实现简单的图像识别。 使用TensorFlow搭建简单的BP神经网络的模型,一层输入层,一层隐藏,一层输出,最终实现简单的图像识别。 机器学习 -
Android系统调用opencv实现人体识别
2018-01-27 19:13:59Android系统调用opencv实现人体识别。可以实现多个人体的识别,且不会有嵌套框的产生。 -
opencv实现图像颜色增强算法
2018-07-25 11:59:50opencv实现图像颜色增强算法。。。。 ,vs2013+opencv2.4.13 实现。 -
用OpenCV实现Photoshop算法_变为黑白图像
2016-09-11 19:14:11用OpenCV实现Photoshop算法:变为黑白图像 Photoshop提供了一个高级的黑白图像调整功能,可获得更好的黑白图像效果。可设置了 red, yellow, green, cyan, blue, magenta 六个颜色的灰度系数,调整黑白效果。 -
机器学习十大算法编程-基于OpenCV实现
2019-01-04 11:36:11利用OpenCV的机器学习库,实现了机器学习十大算法的程序设计,十分有助于学习应用OpenCV机器学习库,对工程实现具有很好的帮助作用 -
OPENCV目标跟踪_opencv_目标检测_VS2008+opencv实现行人检测的代码程序_行人检测_动态目标检测_VC++
2022-04-28 22:21:06OPENCV目标跟踪_opencv_目标检测_VS2008+opencv实现行人检测的代码程序_行人检测_动态目标检测_VC++ -
python+opencv实现图像模板匹配
2019-02-25 12:19:30通过使用opencv,使用python语言实现图像模板匹配,从而实现图像的类别分类。 -
OpenCV实现马赛克功能
2020-08-28 03:25:29主要为大家详细介绍了OpenCV实现马赛克功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Graph Cut图像分割算法——Python+Opencv实现
2018-05-03 11:41:17基于Opencv,使用python语言,以图割算法实现的图像分割。 -
opencv 实现图像任意角度的旋转
2016-12-07 14:52:16用opencv 2.4.9实现图像任意角度的旋转 -
opencv实现图片模糊和锐化操作
2020-09-19 22:36:42主要为大家详细介绍了opencv实现图片模糊和锐化操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
opencv实现多张图像拼接
2021-01-01 10:39:29本文实例为大家分享了opencv实现多张图像简单拼接,供大家参考,具体内容如下 #include #include #include <opencv2> #include <opencv2> #include<opencv2> using namespace std; using namespace cv; int main... -
VS2008+opencv实现行人检测的代码程序.zip资源matlab opencv运动目标检测程序资料
2022-04-21 21:22:58VS2008+opencv实现行人检测的代码程序.zip资源matlab opencv运动目标检测程序资料VS2008+opencv实现行人检测的代码程序.zip资源matlab opencv运动目标检测程序资料VS2008+opencv实现行人检测的代码程序.zip资源... -
基于Opencv实现的图像纠偏
2015-11-14 09:01:53基于Opencv实现的图像纠偏算法,使用的是边缘检测。先进行图像二值化,在进行黑边裁剪,最后进行纠偏旋转 代码利用改进hough变换实现图像旋转纠偏 -
使用OpenCV实现Halcon算法(4)OpenCV实现边缘模板匹配算法
2021-05-20 09:45:21本文转自:OpenCV研习社 背景概述 OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多OpenCV初学者刚学习到该方法时候很开心,一用该...声明:本篇仅仅是分享网上的开源项目,算法非本人原创。
本文转自:OpenCV研习社
背景概述
OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多OpenCV初学者刚学习到该方法时候很开心,一用该方法马上很伤心,悲喜交加,充分感受到了理想与现实的距离,不过没关系,这里介绍一种新的模板匹配算法,主要是基于图像边缘梯度,它对图像光照与像素迁移都有很强的抗干扰能力,据说Halcon的模板匹配就是基于此的加速版本,在工业应用场景中已经得到广泛使用。
算法原理
该算法主要是基于图像梯度,实现基于梯度级别的NCC模板匹配,基于Sobel梯度算子得到dx, dy, magnitude
通过Canny算法得到边缘图像、基于轮廓发现得到所有的轮廓点集,基于每个点计算该点的dx、dy、magnitude(dxy)三个值。生成模板信息。然后对输入的图像进行Sobel梯度图像之后,根据模型信息进行匹配,这样的好处有两个:
- 梯度对光照有很强的抗干扰能力,对模板匹配的抗光照干扰
- 基于梯度匹配,可以对目标图像上出现的微小像素迁移进行抵消。
算法实现代码详解
梯度图像计算
Mat gx, gy; Sobel(gray, gx, CV_32F, 1, 0); Sobel(gray, gy, CV_32F, 0, 1); Mat magnitude, direction; cartToPolar(gx, gy, magnitude, direction); long contoursLength = 0; double magnitudeTemp = 0; int originx = contours[0][0].x; int originy = contours[0][0].y;
模板生成
// 提取dx\dy\mag\log信息 vector<vector<ptin>> contoursInfo; // 提取相对坐标位置 vector<vector<Point>> contoursRelative; // 开始提取 for (int i = 0; i < contours.size(); i++) { int n = contours[i].size(); contoursLength += n; contoursInfo.push_back(vector<ptin>(n)); vector<Point> points(n); for (int j = 0; j < n; j++) { int x = contours[i][j].x; int y = contours[i][j].y; points[j].x = x - originx; points[j].y = y - originy; ptin pointInfo; pointInfo.DerivativeX = gx.at<float>(y, x); pointInfo.DerivativeY = gy.at<float>(y, x); magnitudeTemp = magnitude.at<float>(y, x); pointInfo.Magnitude = magnitudeTemp; if (magnitudeTemp != 0) pointInfo.MagnitudeN = 1 / magnitudeTemp; contoursInfo[i][j] = pointInfo; } contoursRelative.push_back(points); }
计算目标图像梯度
// 计算目标图像梯度 Mat grayImage; cvtColor(src, grayImage, COLOR_BGR2GRAY); Mat gradx, grady; Sobel(grayImage, gradx, CV_32F, 1, 0); Sobel(grayImage, grady, CV_32F, 0, 1); Mat mag, angle; cartToPolar(gradx, grady, mag, angle);
形状模板匹配
double partialScore = 0; double resultScore = 0; int resultX = 0; int resultY = 0; double start = (double)getTickCount(); for (int row = 0; row < grayImage.rows; row++) { for (int col = 0; col < grayImage.cols; col++) { double sum = 0; long num = 0; for (int m = 0; m < contoursRelative.size(); m++) { for (int n = 0; n < contoursRelative[m].size(); n++) { num += 1; int curX = col + contoursRelative[m][n].x; int curY = row + contoursRelative[m][n].y; if (curX < 0 || curY < 0 || curX > grayImage.cols - 1 || curY > grayImage.rows - 1) { continue; } // 目标边缘梯度 double sdx = gradx.at<float>(curY, curX); double sdy = grady.at<float>(curY, curX); // 模板边缘梯度 double tdx = contoursInfo[m][n].DerivativeX; double tdy = contoursInfo[m][n].DerivativeY; // 计算匹配 if ((sdy != 0 || sdx != 0) && (tdx != 0 || tdy != 0)) { double nMagnitude = mag.at<float>(curY, curX); if (nMagnitude != 0) sum += (sdx * tdx + sdy * tdy) * contoursInfo[m][n].MagnitudeN / nMagnitude; } // 任意节点score之和必须大于最小阈值 partialScore = sum / num; if (partialScore < min((minScore - 1) + (nGreediness * num), nMinScore * num)) break; } } // 保存匹配起始点 if (partialScore > resultScore) { resultScore = partialScore; resultX = col; resultY = row; } } }
运行效果
正常光照
光照非常暗
改进:
不需要全局匹配,可以对目标图像先做一个小梯度阈值,然后再进行匹配,提升速度、构造目标图像金字塔,实现多分辨率模板匹配支持!
觉得不错点【好看】支持一下!
参考:
Edge Based Template Matching - CodeProject
https://github.com/meiqua/shape_based_matching
https://github.com/daxiaHuang/edge-template-match
基于边界的模板匹配的原理及算法实现
-
Opencv实现的利用监控摄像头对高速路口车流量计数.zip资源matlab opencv运动目标检测程序资料
2022-04-21 21:11:56Opencv实现的利用监控摄像头对高速路口车流量计数.zip资源matlab opencv运动目标检测程序资料Opencv实现的利用监控摄像头对高速路口车流量计数.zip资源matlab opencv运动目标检测程序资料Opencv实现的利用监控摄像头... -
Opencv实现的利用监控摄像头对高速路口车流量计数.zip
2022-04-18 20:17:10Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的... -
利用MFC和OpenCV实现的图片浏览器,支持放大缩小拖拽
2014-07-26 19:00:12利用MFC和OpenCV实现的图片浏览器,支持放大缩小拖拽 -
opencv实现背景分离
2019-02-19 15:00:22使用opencv函数grabcut,实现前景和背景分离 使用opencv函数grabcut,实现前景和背景分离