IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> opencv目标检测 -> 正文阅读

[人工智能]opencv目标检测

目前常用的实用性目标检测与跟踪的方式方法有以下两种:

1. 帧差法

? ? ? ? 视频是由一帧帧的图片顺序播放组成, 通过对比前一帧的图像与现在这一帧对比,该方法对于运动目标过于敏感, 而且需要保障镜头必须保持固定,因此帧差法适用于行人稀少或者夜晚场景,能够有效的识别出移动目标出来。

1.1 帧差法函数

/*****************************************************************
* 函数名称: Mat video_run::moveCheck(Mat &frame1, Mat &teme1)
* 功能描述: 帧差法
* 参数说明: Mat &frame1  当前帧
*          Mat &teme1    前一帧
* 返回值:   给动过的物体绘制矩形
* 修改记录:
*    日期: 2022-07-29  修改人: yida
*    描述:
*    日期: 2022-07-29  修改人: yida
*    描述:
******************************************************************/

Mat video_run::moveCheck(Mat &frame1, Mat &teme1)
{
    Mat res, sres;
    Mat frameGray, temeGray;
    sres = frame1.clone();
    //1、灰度处理目的:RGB三通道转灰度单通道,压缩到原图片三分之一大小
    cvtColor(frame1, frameGray,CV_BGR2GRAY);
    cvtColor(teme1, temeGray,CV_BGR2GRAY);

    // 2. 帧差处理  找到两帧之间的差别、(正在运动的物体)
    absdiff(frameGray, temeGray,res);
    //imshow("res", res);

    // 3. 二值化处理  把灰度图像转为黑白图像
    threshold(res, res, 25, 255, CV_THRESH_BINARY);
    //imshow("threshold", res);

    //4. 图像降噪  开运算 先腐蚀再膨胀  去除主要物体外部周边的白色
    //闭运算 先膨胀再腐蚀  作用: 去除主要物体内部的黑色
    // 4.1 腐蚀 , 减少白色区域
    Mat element = cv::getStructuringElement(MORPH_RECT, Size(3, 3));
    erode(res, res, element);
    //imshow("erode", res );
    //4-2、膨胀目的:把白色区域变大
     Mat element2 = cv::getStructuringElement(MORPH_RECT, Size(20, 20));
    dilate(res, res, element2);
    //imshow("dilate", res);

    //5 .提取关键点
    // 寻找特征点
    vector<vector<Point>> constours;  //关键点
    findContours(res, constours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    //
    vector<vector<Point>> constours2(constours.size());  //关键点
    vector<Rect> rect1(constours.size());  //矩形

    int x, y , w, h;
    int num = constours.size();

    for(int i = 0; i < num ; ++i)
    {
        approxPolyDP(Mat(constours[i]), constours2[i], 3, true );
        //多边拟合
        rect1[i] = boundingRect(Mat(constours2[i]));
        x = rect1[i].x;
        y = rect1[i].y;
        w = rect1[i].width;
        h = rect1[i].height;

        //绘制矩形
        rectangle(sres, Point(x, y), Point(x+w, y + h), Scalar(0, 255, 120));
    }

    return sres;
}

2. 级联分类器

? ? ? ? 帧差法能够有效的识别出运动的物体,但是并不能有效的挑出用户需要的物体,会把用户不需要的物体一起识别出来并且框选出来。

? ? ? ? 因此需要让程序学会识别出需要的目标以及不想识别到的目标。

2.1 操作步骤 (opencv 训练 级联分类器文件)

? ? ? ? 1. 正样本数据采集(需要检测的物体图片)

? ? ? ? 2. 负样本数据采集(非检测物的图片)

? ? ? ? 3. 调用opencv程序opencv_createsamples.exe程序实现样本数据采集

? ? ? ? 4. 调用opencv程序opencv_traincascade.exe样本训练程序进行训练

? ? ? ? 5. 生成级联分类器文件

2.2 级联分类器文件调用实现车辆检测 函数

/*****************************************************************
* 函数名称: void detectVarDaw(Mat &frame, CascadeClassifier &cascade, double scale)
* 功能描述: 通过级联分类器进行车辆识别
* 参数说明: Mat &frame    传入的一帧opencv  mat图片
*            CascadeClassifier &cascade   训练好的级联分类器文件
*            double scale     压缩的倍数
* 返回值:    无
* 修改记录:
*    日期: 2022-08-01  修改人: yida
*    描述:
*    日期: 2022-08-01  修改人: yida
*    描述:
******************************************************************/

void detectVarDaw(Mat &frame, CascadeClassifier &cascade, double scale)
{
    //灰度处理
    Mat fgray;
    cvtColor(frame, fgray, CV_RGB2GRAY);

    //灰度压缩scale
    Mat smalling(cvRound(frame.rows/scale), cvRound(frame.cols/scale), CV_8UC1); //定义一个接收resize 的容器
    resize(fgray, smalling, smalling.size(), 0,0, INTER_LINEAR);

    //直方图均值化, 让灰度图经过直方图函数处理, 黑白分明
    equalizeHist(smalling, smalling);

    vector<Rect>cars;
    cascade.detectMultiScale(smalling, cars, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ) ;

    //绘制矩形
    vector<Rect>::const_iterator iter;

    for (iter=cars.begin() ;iter != cars.end( ) ;iter++){
    rectangle(frame ,
        CvPoint(cvRound(iter->x*scale) , cvRound(iter->y*scale) ),
         CvPoint(cvRound((iter->x+iter->width)*scale) , cvRound((iter->y+iter->height)*scale)),Scalar(0,255,0),2,8);
    }

    imshow ( "frame" ,frame) ;

}

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:44:55  更:2022-08-06 10:46:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:55:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码