opencv车道线检测的实现方法

车道线检测,需要完成以下功能:

  • 图像裁剪:通过设定图像ROI区域,拷贝图像获得裁剪图像
  • 反透视变换:用的是室外采集到的视频,没有对应的变换矩阵。所以建立二维坐标,通过四点映射的方法计算矩阵,进行反透视变化。后因ROI区域的设置易造成变换矩阵获取困难和插值得到的透视图效果不理想,故没应用
  • 二值化:先变化为灰度图,然后设定阈值直接变成二值化图像。
  • 形态学滤波:对二值化图像进行腐蚀,去除噪点,然后对图像进行膨胀,弥补对车道线的腐蚀。
  • 边缘检测:canny变化、sobel变化和laplacian变化中选择了效果比较好的canny变化,三者在代码中均可以使用,canny变化效果稍微好一点。
  • 直线检测:实现了两种方法 1>使用opencv库封装好的霍夫直线检测函数,在原图对应区域用红线描出车道线 2>自己写一种直线检测,在头文件中,遍历ROI区域进行特定角度范围的直线检测。两种方法均可在视频中体现,第一种方法运行效率较快。
  • 按键控制:空格暂停,其余键退出,方便调试和截图。

实现的效果

在亮度良好道路条件良好的情况下,检测车前区域的车道线实现比较成功,排除掉高速护栏的影响,而且原图像还能完整体现。

车子行驶在高速公路大型弯道上,可以在一定角度范围内认定车道线仍是直线,检测出为直线。

车子切换过程中只有一根车道线被识别,但是稳定回变换车道后,实现效果良好。减速线为黄色,二值化是也被过滤,没造成影响。

刚进入隧道时,摄像机光源基本处于高光状态,拍摄亮度基本不变,二值化图像时情况良好,噪声比较多但是没产生多大线状影响;当摄像头自动调节亮度,图像亮度变低,二值化时同一阈值把车道线给过滤掉,造成无法识别车道线的现象。

在道路损坏的情况下,由于阈值一定,基本上检测不出车道线。

结论

实现的功能:实现了车道线检测的基本功能,反透视变换矩阵实现了但效果不太理想,使用自己写的直线检测部分,车道线识别抗干扰能力较强。

缺点:整个识别系统都是固定的参数,只能在特定的环境产生良好的效果。

改进空间:提取全部关键参数,每次对ROI图像进行快速扫描更新参数,否则使用默认参数。例如,可以选择每次5间隔取点,以像素最高点的85%作为该次二值化的阈值。从而做到动态车道线识别。

完整代码

方法一

main.cpp

#include<cv.h>
#include<cxcore.h>
#include<highgui.h>
#include"mylinedetect.h"

#include<cstdio>
#include<iostream>
using namespace std;

int main(){
  //声明IplImage指针
  IplImage* pFrame = NULL;
  IplImage* pCutFrame = NULL;
  IplImage* pCutFrImg = NULL;
  //声明CvCapture指针
  CvCapture* pCapture = NULL;
  //声明CvMemStorage和CvSeg指针
  CvMemStorage* storage = cvCreateMemStorage();
  CvSeq* lines = NULL;
  //生成视频的结构
  VideoWriter writer("result.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(856, 480));
  //当前帧数
  int nFrmNum = 0;
  //裁剪的天空高度
  int CutHeight = 310;
  //窗口命名
  cvNamedWindow("video", 1);
  cvNamedWindow("BWmode", 1);
  //调整窗口初始位置
  cvMoveWindow("video", 300, 0);
  cvMoveWindow("BWmode", 300, 520);
  //不能打开则退出
  if (!(pCapture = cvCaptureFromFile("lane.avi"))){
    fprintf(stderr, "Can not open video file\n");
    return -2;
  }
  //每次读取一桢的视频
  while (pFrame = cvQueryFrame(pCapture)){
    //设置ROI裁剪图像
    cvSetImageROI(pFrame, cvRect(0, CutHeight, pFrame->width, pFrame->height - CutHeight));
    nFrmNum++;
    //第一次要申请内存p
    if (nFrmNum == 1){
      pCutFrame = cvCreateImage(cvSize(pFrame->width, pFrame->height - CutHeight), pFrame->depth, pFrame->nChannels);
      cvCopy(pFrame, pCutFrame, 0);
      pCutFrImg = cvCreateImage(cvSize(pCutFrame->width, pCutFrame->height), IPL_DEPTH_8U, 1);
      //转化成单通道图像再处理
      cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
    }
    else{
      //获得剪切图
      cvCopy(pFrame, pCutFrame, 0);
#if 0    //反透视变换
      //二维坐标下的点,类型为浮点
      CvPoint2D32f srcTri[4], dstTri[4];
      CvMat* warp_mat = cvCreateMat(3, 3, CV_32FC1);
      //计算矩阵反射变换
      srcTri[0].x = 10;
      srcTri[0].y = 20;
      srcTri[1].x = pCutFrame->width - 5;
      srcTri[1].y = 0;
      srcTri[2].x = 0;
      srcTri[2].y = pCutFrame->height - 1;
      srcTri[3].x = pCutFrame->width - 1;
      srcTri[3].y = pCutFrame->height - 1;
      //改变目标图像大小
      dstTri[0].x = 0;
      dstTri[0].y = 0;
      dstTri[1].x = pCutFrImg->width - 1;
      dstTri[1].y = 0;
      dstTri[2].x = 0;
      dstTri[2].y = pCutFrImg->height - 1;
      dstTri[3].x = pCutFrImg->width - 1;
      dstTri[3].y = pCutFrImg->height - 1;
      //获得矩阵
      cvGetPerspectiveTransform(srcTri, dstTri, warp_mat);
      //反透视变换
      cvWarpPerspective(pCutFrame, pCutFrImg, warp_mat);
#endif
      //前景图转换为灰度图
      cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
      //二值化前景图
      cvThreshold(pCutFrImg, pCutFrImg, 80, 255.0, CV_THRESH_BINARY);
      //进行形态学滤波,去掉噪音
      cvErode(pCutFrImg, pCutFrImg, 0, 2);
      cvDilate(pCutFrImg, pCutFrImg, 0, 2);
      //canny变化
      cvCanny(pCutFrImg, pCutFrImg, 50, 120);
      //sobel变化
      //Mat pCutFrMat(pCutFrImg);
      //Sobel(pCutFrMat, pCutFrMat, pCutFrMat.depth(), 1, 1);
      //laplacian变化
      //Laplacian(pCutFrMat, pCutFrMat, pCutFrMat.depth());
#if 1    //0为下面的代码,1为上面的代码
  #pragma region Hough直线检测
      lines = cvHoughLines2(pCutFrImg, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 100, 15, 15);
      printf("Lines number: %d\n", lines->total);
      //画出直线
      for (int i = 0; i<lines->total; i++){
        CvPoint* line = (CvPoint*)cvGetSeqElem(lines, i);
        double k = ((line[0].y - line[1].y)*1.0 / (line[0].x - line[1].x));
        cout<<"nFrmNum "<<nFrmNum<<" 's k = "<<k<<endl;
        if(!(abs(k)<0.1))//去掉水平直线
          cvLine(pFrame, line[0], line[1], CV_RGB(255, 0, 0), 6, CV_AA);
      }
  #pragma endregion
#else
  #pragma region mylinedetect
      Mat edge(pCutFrImg);
      vector<struct line> lines = detectLine(edge, 60);
      Mat pFrameMat(pFrame);
      drawLines(pFrameMat, lines);
      namedWindow("mylinedetect", 1);
      imshow("mylinedetect", pFrameMat);
  #pragma endregion
#endif
      //恢复ROI区域
      cvResetImageROI(pFrame);
      //写入视频流
      writer << pFrame;
      //显示图像
      cvShowImage("video", pFrame);
      cvShowImage("BWmode", pCutFrImg);
      //按键事件,空格暂停,其他跳出循环
      int temp = cvWaitKey(2);
      if (temp == 32){
        while (cvWaitKey() == -1);
      }
      else if (temp >= 0){
        break;
      }
    }
  }
  //销毁窗口
  cvDestroyWindow("video");
  cvDestroyWindow("BWmode");
  //释放图像
  cvReleaseImage(&pCutFrImg);
  cvReleaseImage(&pCutFrame);
  cvReleaseCapture(&pCapture);

  return 0;
}

mylinedetect.h

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <vector>
#include <cmath>
using namespace cv;
using namespace std;

const double pi = 3.1415926f;
const double RADIAN = 180.0 / pi;

struct line{
  int theta;
  int r;
};

vector<struct line> detectLine(Mat &img, int threshold){
  vector<struct line> lines;
  int diagonal = floor(sqrt(img.rows*img.rows + img.cols*img.cols));
  vector< vector<int> >p(360, vector<int>(diagonal));
  //统计数量
  for (int j = 0; j < img.rows; j++) {
    for (int i = 0; i < img.cols; i++) {
      if (img.at<unsigned char>(j, i) > 0){
        for (int theta = 0; theta < 360; theta++){
          int r = floor(i*cos(theta / RADIAN) + j*sin(theta / RADIAN));
          if (r < 0)
            continue;
          p[theta][r]++;
        }
      }
    }
  }
  //获得最大值
  for (int theta = 0; theta < 360; theta++){
    for (int r = 0; r < diagonal; r++){
      int thetaLeft = max(0, theta - 1);
      int thetaRight = min(359, theta + 1);
      int rLeft = max(0, r - 1);
      int rRight = min(diagonal - 1, r + 1);
      int tmp = p[theta][r];
      if (tmp > threshold
        && tmp > p[thetaLeft][rLeft] && tmp > p[thetaLeft][r] && tmp > p[thetaLeft][rRight]
        && tmp > p[theta][rLeft] && tmp > p[theta][rRight]
        && tmp > p[thetaRight][rLeft] && tmp > p[thetaRight][r] && tmp > p[thetaRight][rRight]){
        struct line newline;
        newline.theta = theta;
        newline.r = r;
        lines.push_back(newline);
      }
    }
  }
  return lines;
}

void drawLines(Mat &img, const vector<struct line> &lines){
  for (int i = 0; i < lines.size(); i++){
    vector<Point> points;
    int theta = lines[i].theta;
    int r = lines[i].r;

    double ct = cos(theta / RADIAN);
    double st = sin(theta / RADIAN);

    //公式 r = x*ct + y*st
    //计算左边
    int y = int(r / st);
    if (y >= 0 && y < img.rows){
      Point p(0, y);
      points.push_back(p);
    }
    //计算右边
    y = int((r - ct*(img.cols - 1)) / st);
    if (y >= 0 && y < img.rows){
      Point p(img.cols - 1, y);
      points.push_back(p);
    }
    //计算上边
    int x = int(r / ct);
    if (x >= 0 && x < img.cols){
      Point p(x, 0);
      points.push_back(p);
    }
    //计算下边
    x = int((r - st*(img.rows - 1)) / ct);
    if (x >= 0 && x < img.cols){
      Point p(x, img.rows - 1);
      points.push_back(p);
    }
    //画线
    cv::line(img, points[0], points[1], Scalar(255, 0, 0), 5, CV_AA);
  }
}

方法二:

#include<cv.h>
#include<cxcore.h>
#include<highgui.h>

#include<cstdio>
#include<iostream>
using namespace std;

int main(){
  //声明IplImage指针
  IplImage* pFrame = NULL;
  IplImage* pCutFrame = NULL;
  IplImage* pCutFrImg = NULL;
  IplImage* pCutBkImg = NULL;
  //声明CvMat指针
  CvMat* pCutFrameMat = NULL;
  CvMat* pCutFrMat = NULL;
  CvMat* pCutBkMat = NULL;
  //声明CvCapture指针
  CvCapture* pCapture = NULL;
  //声明CvMemStorage和CvSeg指针
  CvMemStorage* storage = cvCreateMemStorage();
  CvSeq* lines = NULL;
  //当前帧数
  int nFrmNum = 0;
  //裁剪的天空高度
  int CutHeight = 250;
  //窗口命名
  cvNamedWindow("video", 1);
  //cvNamedWindow("background", 1);
  cvNamedWindow("foreground", 1);
  //调整窗口初始位置
  cvMoveWindow("video", 300, 30);
  cvMoveWindow("background", 100, 100);
  cvMoveWindow("foreground", 300, 370);
  //不能打开则退出
  if (!(pCapture = cvCaptureFromFile("lane.avi"))){
    fprintf(stderr, "Can not open video file\n");
    return -2;
  }
  //每次读取一桢的视频
  while (pFrame = cvQueryFrame(pCapture)){
    //设置ROI裁剪图像
    cvSetImageROI(pFrame, cvRect(0, CutHeight, pFrame->width, pFrame->height - CutHeight));
    nFrmNum++;
    //第一次要申请内存p
    if (nFrmNum == 1){
      pCutFrame = cvCreateImage(cvSize(pFrame->width, pFrame->height - CutHeight), pFrame->depth, pFrame->nChannels);
      cvCopy(pFrame, pCutFrame, 0);
      pCutBkImg = cvCreateImage(cvSize(pCutFrame->width, pCutFrame->height), IPL_DEPTH_8U, 1);
      pCutFrImg = cvCreateImage(cvSize(pCutFrame->width, pCutFrame->height), IPL_DEPTH_8U, 1);

      pCutBkMat = cvCreateMat(pCutFrame->height, pCutFrame->width, CV_32FC1);
      pCutFrMat = cvCreateMat(pCutFrame->height, pCutFrame->width, CV_32FC1);
      pCutFrameMat = cvCreateMat(pCutFrame->height, pCutFrame->width, CV_32FC1);
      //转化成单通道图像再处理
      cvCvtColor(pCutFrame, pCutBkImg, CV_BGR2GRAY);
      cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
      //转换成矩阵
      cvConvert(pCutFrImg, pCutFrameMat);
      cvConvert(pCutFrImg, pCutFrMat);
      cvConvert(pCutFrImg, pCutBkMat);
    }
    else{
      //获得剪切图
      cvCopy(pFrame, pCutFrame, 0);
      //前景图转换为灰度图
      cvCvtColor(pCutFrame, pCutFrImg, CV_BGR2GRAY);
      cvConvert(pCutFrImg, pCutFrameMat);
      //高斯滤波先,以平滑图像
      cvSmooth(pCutFrameMat, pCutFrameMat, CV_GAUSSIAN, 3, 0, 0.0);
      //当前帧跟背景图相减
      cvAbsDiff(pCutFrameMat, pCutBkMat, pCutFrMat);
      //二值化前景图
      cvThreshold(pCutFrMat, pCutFrImg, 35, 255.0, CV_THRESH_BINARY);
      //进行形态学滤波,去掉噪音
      cvErode(pCutFrImg, pCutFrImg, 0, 1);
      cvDilate(pCutFrImg, pCutFrImg, 0, 1);
      //更新背景
      cvRunningAvg(pCutFrameMat, pCutBkMat, 0.003, 0);
      //pCutBkMat = cvCloneMat(pCutFrameMat);
      //将背景转化为图像格式,用以显示
      //cvConvert(pCutBkMat, pCutBkImg);
      cvCvtColor(pCutFrame, pCutBkImg, CV_BGR2GRAY);
      //canny变化
      cvCanny(pCutFrImg, pCutFrImg, 50, 100);
      #pragma region Hough检测
      lines = cvHoughLines2(pCutFrImg, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 100, 30, 15);
      printf("Lines number: %d\n", lines->total);
      //画出直线
      for (int i = 0; i<lines->total; i++){
        CvPoint* line = (CvPoint* )cvGetSeqElem(lines, i);
        cvLine(pCutFrame, line[0], line[1], CV_RGB(255, 0, 0), 6, CV_AA);
      }
      #pragma endregion
      //显示图像
      cvShowImage("video", pCutFrame);
      cvShowImage("background", pCutBkImg);
      cvShowImage("foreground", pCutFrImg);
      //按键事件,空格暂停,其他跳出循环
      int temp = cvWaitKey(2);
      if (temp == 32){
        while (cvWaitKey() == -1);
      }
      else if (temp >= 0){
        break;
      }
    }
    //恢复ROI区域(多余可去掉)
    cvResetImageROI(pFrame);
  }
  //销毁窗口
  cvDestroyWindow("video");
  cvDestroyWindow("background");
  cvDestroyWindow("foreground");
  //释放图像和矩阵
  cvReleaseImage(&pCutFrImg);
  cvReleaseImage(&pCutBkImg);
  cvReleaseImage(&pCutFrame);
  cvReleaseMat(&pCutFrameMat);
  cvReleaseMat(&pCutFrMat);
  cvReleaseMat(&pCutBkMat);
  cvReleaseCapture(&pCapture);

  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-08-02

OpenCV-Python实现轮廓检测实例分析

相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV检测并绘制轮廓. 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍在OpenCV-Python中检测并绘制轮廓的方法. 本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识.笔者推荐清华大学出版社的<图像处理与计算机视觉算法及应用(第2版)>. 轮廓检测 轮廓检测也是图像处理中经常用到的.Ope

opencv实现图片与视频中人脸检测功能

本文实例为大家分享了opencv实现人脸检测功能的具体代码,供大家参考,具体内容如下 第一章:反思与总结 上一篇博客我相信自己将人脸检测中的AdaBoost算法解释的非常清晰了,以及如何训练人脸检测的强分类器:人脸检测中AdaBoost算法详解.事后,自我感觉对这个人脸检测还是不够具体,所以自己抽了一下午的时间用opencv实现图片与视频中的人脸检测,下面是我用vs2013加opencv4.9来实现的.做一下声明,我的代码是参考OpenCV实现人脸检测的一个博客写的,非常感谢这位博主,我学到了很

python+opencv实现霍夫变换检测直线

本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 python+opencv实现高斯平滑滤波 python+opencv实现阈值分割 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLinesP直接给出了直线的断点,在画出线段的时候可以偷懒 代码: # -*- coding: utf-8 -*- import cv2

使用OpenCV实现检测和追踪车辆

本文实例为大家分享了OpenCV实现检测和追踪车辆的具体代码,供大家参考,具体内容如下 完整源码GitHub 使用高斯混合模型(BackgroundSubtractorMOG2)对背景建模,提取出前景 使用中值滤波去掉椒盐噪声,再闭运算和开运算填充空洞 使用cvBlob库追踪车辆,我稍微修改了cvBlob源码来通过编译 由于要对背景建模,这个方法要求背景是静止的 另外不同车辆白色区域不能连通,否则会认为是同一物体 void processVideo(char* videoFilename) {

Java+opencv3.2.0实现人脸检测功能

说到人脸检测,首先要了解Haar特征分类器.Haar特征分类器说白了就是一个个的xml文件,不同的xml里面描述人体各个部位的特征值,比如人脸.眼睛等等.OpenCV3.2.0中提供了如下特征文件: haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml haarcascade_frontalface

利用Opencv中Houghline方法实现直线检测

利用Opencv中的Houghline方法进行直线检测-python语言 这是给Python部落翻译的文章,请在这里看原文. 在图像处理中,霍夫变换用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲. 下面我们将看到利用HoughLine算法来阐述霍夫变化进行直线检测的原理,把此算法应用到特点图像的边缘检测是可取的.边缘检测方法请参考这篇文章–边缘检测. Houghline算法基础 直线可以表示为y=mx+c,或者以极坐标形式表示为r=xcosθ+ysinθ,其中r是原点到直线

Python+OpenCV人脸检测原理及示例详解

关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

python opencv检测目标颜色的实例讲解

实例如下所示: # -*- coding:utf-8 -*- __author__ = 'kingking' __version__ = '1.0' __date__ = '14/07/2017' import cv2 import numpy as np import time if __name__ == '__main__': Img = cv2.imread('example.png')#读入一幅图像 kernel_2 = np.ones((2,2),np.uint8)#2x2的卷积核

python结合opencv实现人脸检测与跟踪

模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

Python基于OpenCV实现人脸检测并保存

本文实例为大家分享了Python基于OpenCV实现人脸检测,并保存的具体代码,供大家参考,具体内容如下 安装opencv 如果安装了pip的话,Opencv的在windows的安装可以直接通过cmd命令pip install opencv-python(只需要主要模块),也可以输入命令pip install opencv-contrib-python(如果需要main模块和contrib模块) 详情可以点击此处 导入opencv import cv2 所有包都包含haarcascade文件.这

python版opencv摄像头人脸实时检测方法

OpenCV版本3.3.0,注意模型文件的路径要改成自己所安装的opencv的模型文件的路径,路径不对就会报错,一般在opencv-3.3.0/data/haarcascades 路径下 import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cap = cv2.VideoCapture(0) while True: ret,img = ca

Python下应用opencv 实现人脸检测功能

使用OpenCV's Haar cascades作为人脸检测,因为他做好了库,我们只管使用. 代码简单,除去注释,总共有效代码只有10多行. 所谓库就是一个检测人脸的xml 文件,可以网上查找,下面是一个地址: https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml 如何构造这个库,学习完本文后可以参考: http://note.sonots.com/Sc

C++利用opencv实现人脸检测

小编所有的帖子都是基于unbuntu系统的,当然稍作修改同样试用于windows的,经过小编的绞尽脑汁,把刚刚发的那篇python 实现人脸和眼睛的检测的程序用C++ 实现了,当然,也参考了不少大神的博客,下面我们就一起来看看: Linux系统下安装opencv我就再啰嗦一次,防止有些人没有安装没调试出来喷小编的程序是个坑, sudo apt-get install libcv-dev sudo apt-get install libopencv-dev 看看你的usr/share/opencv

python利用Opencv实现人脸识别功能

本文实例为大家分享了python利用Opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下 首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(w

Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

一.dlib以及opencv-python库安装 介于我使用的是jupyter notebook,所以在安装dlib和opencv-python时是在 这个命令行安装的 dlib安装方法: 1.若可以,直接使用上图所示命令行输入以下命令: pip install cmake pip install boost pip install dlib 若安装了visual studio2019应该就可以直接pip install dlib,至少我是这样 由于很多在执行第三句时都会报错,所以这里提供第二种

基于openCV实现人脸检测

openCV的人脸识别主要通过Haar分类器实现,当然,这是在已有训练数据的基础上.openCV安装在 opencv/opencv/sources/data/haarcascades_cuda(或haarcascades)中存在预先训练好的物体检测器(xml格式),包括正脸.侧脸.眼睛.微笑.上半身.下半身.全身等. openCV的的Haar分类器是一个监督分类器,首先对图像进行直方图均衡化并归一化到同样大小,然后标记里面是否包含要监测的物体.它首先由Paul Viola和Michael Jon

OpenCV实现人脸检测

前段日子,写了个人脸检测的小程序,可以检测标记图片.视频.摄像头中的人脸.效果还行吧,用的是opencv提供人脸库.至于具体的人脸检测原理,找资料去啃吧. 环境:VS2013+OPENCV2.4.10+Win8.1 一.基于对话框的MFC 首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消"安全开发周期(SDL)检查"勾选,我自己习惯取消这个). 放置Button,设置Button的ID和Caption. 图片按钮--ID:IDC_FACEDETECT 视频

Java+OpenCV实现人脸检测并自动拍照

java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBasic.java package com.njupt.zhb.test; import java.awt.EventQueue; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; im