精华内容
下载资源
问答
  • opencv实现
    千次阅读
    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卡尺工具
  • 基于OpenCV实现仿halcon卡尺工具源码
  • 使用OpenCV中的calibrateCamera函数进行张正友相机标定,得到相机内参矩阵。 使用OpenCV中的calibrateCamera函数进行张正友相机标定,得到相机内参矩阵。
  • 先调用 OpenCV 函数实现透视变换,自己编写代码实现透视变换。 3、识别一张倾斜拍摄的纸张,找出轮廓,提取出该纸张的位置 4、 假设你已通过图像处理的算法找到发生形变的纸张的位置,那么对这个倾斜 纸张进行变换,...
  • 主要为大家详细介绍了Opencv实现抠图替换背景图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码-附件资源
  • OpenCV实现人脸图像卡通化
  • 光流法opencv实现

    2018-07-14 17:40:23
    基于opencv的光流法,实现目标的运动检测,修改自其它下载资源,只需该视频文件地址,即可直接运行,注意视频格式和大小
  • 数字图像处理基础及OPENCV实现.pdf,高清并且带有书签,有需要的可以下载
  • opencv实现水面垃圾的检测(对文件夹内的图片进行检测)(附结果图)
  • TensorFlow + Opencv 实现简单的图像识别。 使用TensorFlow搭建简单的BP神经网络的模型,一层输入层,一层隐藏,一层输出,最终实现简单的图像识别。 机器学习
  • Android系统调用opencv实现人体识别。可以实现多个人体的识别,且不会有嵌套框的产生。
  • opencv实现图像颜色增强算法。。。。 ,vs2013+opencv2.4.13 实现。
  • OpenCV实现Photoshop算法:变为黑白图像 Photoshop提供了一个高级的黑白图像调整功能,可获得更好的黑白图像效果。可设置了 red, yellow, green, cyan, blue, magenta 六个颜色的灰度系数,调整黑白效果。
  • 利用OpenCV的机器学习库,实现了机器学习十大算法的程序设计,十分有助于学习应用OpenCV机器学习库,对工程实现具有很好的帮助作用
  • OPENCV目标跟踪_opencv_目标检测_VS2008+opencv实现行人检测的代码程序_行人检测_动态目标检测_VC++
  • 通过使用opencv,使用python语言实现图像模板匹配,从而实现图像的类别分类。
  • OpenCV实现马赛克功能

    2020-08-28 03:25:29
    主要为大家详细介绍了OpenCV实现马赛克功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 基于Opencv,使用python语言,以图割算法实现的图像分割。
  • opencv 2.4.9实现图像任意角度的旋转
  • 主要为大家详细介绍了opencv实现图片模糊和锐化操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 本文实例为大家分享了opencv实现多张图像简单拼接,供大家参考,具体内容如下 #include #include #include <opencv2> #include <opencv2> #include<opencv2> using namespace std; using namespace cv; int main...
  • VS2008+opencv实现行人检测的代码程序.zip资源matlab opencv运动目标检测程序资料VS2008+opencv实现行人检测的代码程序.zip资源matlab opencv运动目标检测程序资料VS2008+opencv实现行人检测的代码程序.zip资源...
  • 基于Opencv实现的图像纠偏算法,使用的是边缘检测。先进行图像二值化,在进行黑边裁剪,最后进行纠偏旋转 代码利用改进hough变换实现图像旋转纠偏
  • 本文转自:OpenCV研习社 背景概述 OpenCV中自带的模板匹配算法,完全是像素基本的模板匹配,特别容易受到光照影响,光照稍微有所不同,该方法就会歇菜了!搞得很多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

    基于边界的模板匹配的原理及算法实现

    基于边界的模板匹配的原理及算法实现_小新识图的博客-CSDN博客_halcon模板匹配原理

    基于边界的模板匹配的原理及算法实现C++_模板匹配算法原理,c++模板匹配算法-C++代码类资源-CSDN下载

    展开全文
  • Opencv实现的利用监控摄像头对高速路口车流量计数.zip资源matlab opencv运动目标检测程序资料Opencv实现的利用监控摄像头对高速路口车流量计数.zip资源matlab opencv运动目标检测程序资料Opencv实现的利用监控摄像头...
  • Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的利用监控摄像头对高速路口车流量计数 Opencv实现的...
  • 利用MFC和OpenCV实现的图片浏览器,支持放大缩小拖拽
  • opencv实现背景分离

    2019-02-19 15:00:22
    使用opencv函数grabcut,实现前景和背景分离 使用opencv函数grabcut,实现前景和背景分离

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,498
精华内容 52,999
关键字:

opencv实现

友情链接: 2fsk仿真文件.zip