https://blog.csdn.net/hanss2/article/details/78883515

微信圣诞帽:OpenCV 库Linux下c++实现

这里写图片描述
所需依赖

编译opencv2
    g++编译器
    前置摄像头完好

Opencv haarcascades文件简介

在搜索人脸检测的资料时,直接调用haarcascade_frontalface_alt.xml之类的文件,这个.xml是Opencv内训练好的人脸检测分类器,所在位置为OpenCV安装位置\sources\data\haarcascades\。

haar feather-based cascade classifier for object detection 是由paul viola提出,由rainer lienhart改进。首先,分类器是由数千个一致尺寸的特定物体我们称为正例和反例训练出来。在分类器训练以后,可以用来对一幅图像的区域作出检测。分类器如果检测到该物体跟训练物体类似就输出1,否则输出0。

在一幅图像中搜索目标,可以在图像上移动整个搜索窗口。分类器设计成很容易改变尺寸,这比改变图像的尺寸效率更高。所以要在一幅图像中找到未知尺寸的物体,需要对不同的比例作多次扫描。
编译链接运行

root@master:/home/hanss# g++ -I/usr/local/opencv2/include/ -o giveCap giveCap.cpp  -L/usr/local/opencv2/lib -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -lopencv_nonfree
root@master:/home/hanss# ./giveCap

1
    2
    3

源代码

giveCap.cpp注意改变自己opencv库的位置,我自己电脑上是/usr/local/opencv2

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

//g++ -I/usr/local/opencv2/include/ -o giveCap giveCap.cpp  -L/usr/local/opencv2/lib -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -lopencv_nonfree
#pragma comment(lib,"opencv_core2410d.lib")                
#pragma comment(lib,"opencv_highgui2410d.lib")                
#pragma comment(lib,"opencv_objdetect2410d.lib")   
#pragma comment(lib,"opencv_imgproc2410d.lib")

/** Function Headers */
void detectAndDisplay( Mat frame );

/** Global variables */
//-- Note, either copy these two files from opencv/data/haarscascades to your current folder, or change these locations
String face_cascade_name = "/usr/local/opencv2/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "/usr/local/opencv2/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
string window_name = "Capture - Face detection";
RNG rng(12345);

const int FRAME_WIDTH = 1280;
const int FRAME_HEIGHT = 240;
/**
* @function main
*/
int main(int argc, char const *argv[])
{
    CvCapture* capture;
    Mat frame;

//-- 1. Load the cascades
    if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
    if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };

VideoCapture cap(0);
            if(!cap.isOpened()) 
                return -1;

Mat edges;
            for(;;)
            {
                Mat frame;
                cap >> frame; 
                detectAndDisplay( frame );
                //imshow("edges", frame);
                if(waitKey(30) >= 0) break;
            }
            waitKey(0);

return 0;
}

void mapToMat(const cv::Mat &srcAlpha, cv::Mat &dest, int x, int y)
{
    int nc = 3;
    int alpha = 0;

for (int j = 0; j < srcAlpha.rows; j++)
    {
        for (int i = 0; i < srcAlpha.cols*3; i += 3)
        {
            alpha = srcAlpha.ptr<uchar>(j)[i / 3*4 + 3];
            if(alpha != 0) 
            {
                for (int k = 0; k < 3; k++)
                {
                    // if (src1.ptr<uchar>(j)[i / nc*nc + k] != 0)
                    if( (j+y < dest.rows) && (j+y>=0) &&
                        ((i+x*3) / 3*3 + k < dest.cols*3) && ((i+x*3) / 3*3 + k >= 0) &&
                        (i/nc*4 + k < srcAlpha.cols*4) && (i/nc*4 + k >=0) )
                    {
                        dest.ptr<uchar>(j+y)[(i+x*nc) / nc*nc + k] = srcAlpha.ptr<uchar>(j)[(i) / nc*4 + k];
                    }
                }
            }
        }
    }
}

/**
* @function detectAndDisplay
*/
void detectAndDisplay( Mat frame )
{
    std::vector<Rect> faces;
    Mat frame_gray;
    Mat hatAlpha;

hatAlpha = imread("2.png",-1);

cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
    equalizeHist( frame_gray, frame_gray );
    //-- Detect faces
    face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

for( size_t i = 0; i < faces.size(); i++ )
    {

Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );

Mat faceROI = frame_gray( faces[i] );
        std::vector<Rect> eyes;

//-- In each face, detect eyes
        eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );

for( size_t j = 0; j < eyes.size(); j++ )
        {
            Point eye_center( faces[i].x + eyes[j].x + eyes[j].width/2, faces[i].y + eyes[j].y + eyes[j].height/2 );
            int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
            // circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 3, 8, 0 );
        }

resize(hatAlpha,hatAlpha,Size(faces[i].width, faces[i].height),0,0,INTER_LANCZOS4);
        mapToMat(hatAlpha,frame,faces[i].x,faces[i].y-0.8*faces[i].height);
    }
    //-- Show what you got
    imshow( window_name, frame );
    imwrite("merry christmas.jpg",frame);
}

微信圣诞帽:OpenCV 库Linux下c++实现相关推荐

  1. OpenCV在Linux下的编译安装(Ubuntu )

    OpenCV在Linux下的编译安装(Ubuntu ) 1.先安装相关的库: sudo apt-get install build-essential sudo apt-get install lib ...

  2. linux下python安装opencv库_Linux下怎么配置python和opencv

    匿名用户 1级 2017-06-20 回答 以下说明在Linux下Python和OpenCV结合安装的过程,Python要使用OpenCV模块,则必须导入OpenCV提供的包,所以要提供Python支 ...

  3. Linux内核虚拟摄像头,Qt Opencv 在Linux下摄像头简单示例v1.0

    下面写的文章也许网上也有类似的,但是大多数都没有给出思路及背景,让初学者每次都只能学到一点皮毛,不少知识需要大量搜索零碎地拼凑起来.题外话,虽然现在是碎片化信息时代,但正是这样信息整合能力也显得非常重 ...

  4. PHP编译为静态库,Linux下将Tinyxml编译为静态库

    转载请注明来源:Linux下将Tinyxml编译为静态库 一个应用需要在linux服务器上运行,不能保证每个服务器都有应用依赖的库,又懒得每个服务器都去安装下,也不太现实,于是就将应用所用到的库全部编 ...

  5. linux里c库和gnu c库,Linux下的C的库文件和头文件有什么区别-

    Linux下的C的库文件和头文件有什么区别- (2012-04-10 01:16:57) 标签: linux 杂谈 Linux下的C的库文件和头文件有什么区别?刚刚接触 这里有点没搞清楚 如果按我的理 ...

  6. 【OpenCV】Linux 下用 g++ 编译 OpenCV 程序

    编译命令: g++ gaussianBlur.cpp -o test `pkg-config --cflags --libs opencv` 执行编译生成的可执行文件: ./test gaussian ...

  7. linux如何编译boost指定库,linux下编译安装boost库

    linux下编译安装boost库 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15 UTC 2015 x ...

  8. linux的oracle怎么建库,linux下oracle手工建库过程

    1.创建目录 $ORACLE_BASE/admin/ $ORACLE_BASE/oradata $ORACLE_BASE/flash_recovery_area 2.建初始化参数文件 cd   $OR ...

  9. linux 查询程序的依赖库,linux下查看程序依赖的库

    在x86下,为了查看程序所依赖的库,可使用linux 但若是是使用arm-linux-gcc 等交叉编译环境编译出来的程序,则要使用web 库用于将类似函数打包在一个单元中.而后这些单元就可为其余开发 ...

  10. Linux编译soci库,Soci库linux下的编译方法

    Soci库的linux编译方法 1.下载soci库源码 2.在目标机器上配置数据库环境 以oracle为例:(其他数据库只需要简单安装客户端即可) A)下载oracle客户端安装包 oracle-in ...

最新文章

  1. 算法与数据结构重点归纳
  2. linux定时器多次,Spring 定时器执行两次
  3. 在ASP.NET中将图片存储到Sql Server数据库中
  4. Smarty 中的 if 语句条件修饰词
  5. c语言中c为字符型便量,c='97'是否正确,C语言判断题Word版
  6. android 串口通信_使用UART与ZYBO进行通信常用外设设计方案
  7. [渝粤教育] 中国地质大学 Windows程序设计 复习题 (2)
  8. “低代码”将干掉 70% 的软件开发工作
  9. 章子欣父亲发声:感谢提供帮助的媒体,包括百度
  10. 树莓派 cuda加速_用树莓派4b构建深度学习应用(四)PyTorch篇
  11. QNAP+Transmission
  12. 有奖:说出你的网络安全故事
  13. web期末复习---老师划重点!!
  14. RabbitMQ入门用法及消息模型案例
  15. 仓库和门店移动出入库 手持移动终端 pda 扫描打印于一身 扫描打印小票和不干胶标签纸
  16. Thymeleaf (三) ---------Thymeleaf 属性
  17. 一种基于快速GeoHash实现海量商品与商圈高效匹配的算法
  18. vue-element-table列内容显示过多隐藏
  19. matlab绘制螺旋线+隐藏坐标轴+更改背景颜色
  20. bert-pytorch版源码详细解读

热门文章

  1. 自定义 Spring Starter
  2. centos7安装redis并设置开机启动
  3. 【“科大讯飞杯”第十七届同济大学】A 张老师和菜哭武的游戏
  4. origin软件画流程图_免费的网络拓扑流程图绘制软件(PaceStar LanFlow)
  5. 快递单号快速查询,自动识别快递公司
  6. [caffe] Long-term Recurrent Convolutional Networks
  7. 绿色环保静态网页设计
  8. 苹果手机小圆点怎么设置?悬浮球设置,轻松学会
  9. Android Title标题栏的修改(隐藏,菜单)
  10. Excel--Vlookup与match、index函数