Linux下QT配合OpenCV完成图像处理(实现人脸检测)

一、环境介绍 ubuntu版本: vm虚拟机运行ubuntu18.04 64位
opencv版本: 3.4.9
qt版本: 5.12
opencv 是一个基于 bsd 许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在 linux、windows、android 和 mac os 操作系统上。
opencv 的全称是 open source computer vision library,是一个跨平台的计算机视觉库。opencv 是由英特尔公司发起并参与开发,以 bsd 许可证授权发行,可以在商业和研究领域中免费使用。opencv 可用于开发实时的图像处理、计算机视觉以及模式识别程序。
opencv 用 c++语言编写,它具有 c ++,python,java 和 matlab 接口,并支持 windows,linux,android 和 mac os,opencv 主要倾向于实时视觉应用,并在可用时利用 mmx 和 sse 指令, 如今也提供对于 c#、ch、ruby,go 的支持。
二、建立qt工程加入opencv依赖库 下面编写例子很简单,使用opencv自带的分类器,检测一张图中的人脸,并圈出来。
opencv源码自带的人脸检测分类器目录:opencv-3.4.9/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml
xxx.pro工程文件代码:
qt += core guigreaterthan(qt_major_version, 4): qt += widgetsconfig += c++11# the following define makes your compiler emit warnings if you use# any qt feature that has been marked deprecated (the exact warnings# depend on your compiler). please consult the documentation of the# deprecated api in order to know how to port your code away from it.defines += qt_deprecated_warnings# you can also make your code fail to compile if it uses deprecated apis.# in order to do so, uncomment the following line.# you can also select to disable deprecated apis only up to a certain version of qt.#defines += qt_disable_deprecated_before=0x060000 # disables all the apis deprecated before qt 6.0.0sources += \ main.cpp \ widget.cppheaders += \ widget.hforms += \ widget.ui# default rules for deployment.qnx: target.path = /tmp/$${target}/binelse: unix:!android: target.path = /opt/$${target}/bin!isempty(target.path): installs += target#linu平台的路径设置linux {#添加opencv头文件的路径,需要根据自己的头文件路径进行修改includepath+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/include\ /home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv\ /home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv2libs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_calib3d.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_core.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_dnn.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_features2d.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_flann.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_highgui.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_imgcodecs.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_imgproc.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_ml.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_objdetect.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_photo.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_shape.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_stitching.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_superres.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_videoio.solibs+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_video.so} widget.cpp文件代码:
#include widget.h#include ui_widget.hwidget::widget(qwidget *parent) : qwidget(parent) , ui(new ui::widget){ ui->setupui(this); opencv_face();}widget::~widget(){ delete ui;}//分类器的路径#define source_xml_addr /home/wbyq/work_pc/opencv-3.4.9/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml//将要检测的图片路径#define source_pix_addr /mnt/hgfs/linux-share-dir/1.jpg//人脸检测代码void widget::opencv_face(){ static cvmemstorage* storage = 0; static cvhaarclassifiercascade* cascade = 0; fprintf( stderr, start------------------------------>1 \n ); const char*cascade_name =source_xml_addr; //加载分类器 cascade = (cvhaarclassifiercascade*)cvload( cascade_name, 0, 0, 0 ); if( !cascade ) { fprintf( stderr, error: could not load classifier cascade\n ); return ; } //创建内存空间 storage = cvcreatememstorage(0); //加载需要检测的图片 const char* filename =source_pix_addr; iplimage* img = cvloadimage( filename, 1 ); if(img ==nullptr ) { fprintf( stderr, jpg load error! \n ); return; } fprintf( stderr, start------------------------------>2 \n ); double scale=1.2; static cvscalar colors[] = { {{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}}, {{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}} };//just some pretty colors to draw with iplimage* gray = cvcreateimage(cvsize(img->width,img->height),8,1); iplimage* small_img=cvcreateimage(cvsize(cvround(img->width/scale),cvround(img->height/scale)),8,1); cvcvtcolor(img,gray, cv_bgr2gray); cvresize(gray, small_img, cv_inter_linear); cvequalizehist(small_img,small_img); //直方图均衡 cvclearmemstorage(storage); double t = (double)cvgettickcount(); cvseq* objects = cvhaardetectobjects(small_img, cascade, storage, 1.1, 2, 0/*cv_haar_do_canny_pruning*/, cvsize(30,30)); t = (double)cvgettickcount() - t; fprintf( stderr, start------------------------------>3 \n ); //遍历找到对象和周围画盒 for(int i=0;itotal);++i) { cvrect* r=(cvrect*)cvgetseqelem(objects,i); cvrectangle(img, cvpoint(r->x*scale,r->y*scale), cvpoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]); } fprintf( stderr, start------------------------------>4 \n ); for( int i = 0; i total : 0); i++ ) { cvrect* r = (cvrect*)cvgetseqelem( objects, i ); cvpoint center; int radius; 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); cvcircle( img, center, radius, colors[i%8], 3, 8, 0 ); } show_face(img); //显示检测的结果 cvreleaseimage(&gray); cvreleaseimage(&small_img); //释放图片 cvreleaseimage( &img );}//显示检测的结果void widget::show_face(iplimage* img){ /*将opecv的图片转为qimage格式*/ uchar *imgdata=(uchar *)img->imagedata; qimage my_image(imgdata,img->width,img->height,qimage::format_rgb888); my_image =my_image.rgbswapped(); //bgr格式转rgb qpixmap my_pix; //创建画图类 my_pix.convertfromimage(my_image); /*在控件上显示*/ ui->label_display_face->setpixmap(my_pix);} widget.h文件代码:
#ifndef widget_h#define widget_h#include //opencv include#include #include #include qt_begin_namespacenamespace ui { class widget; }qt_end_namespaceclass widget : public qwidget{ q_objectpublic: widget(qwidget *parent = nullptr); void opencv_face(); ~widget(); void show_face(iplimage* img);private: ui::widget *ui;};#endif // widget_h 运行代码检测结果如下:

iPhone仍是苹果在智能手机市场的杀手锏
人工智能时代已经来临_它的未来也在改变着人类的未来
VR游戏《Crisis VRigade》目前已经是SideQuest下载量最高的应用程序
全球前30大PCB厂总盘点 过半是中国企业
以后你的手机想怎么弯就怎么弯,因为有它
Linux下QT配合OpenCV完成图像处理(实现人脸检测)
如何使用Laplace方程仿真滤波器和运算放大器?
超星未来与北科天绘达成战略合作打造高效实时激光雷达感知解决方案
LED蓝光危害评估
工商业光伏发电系统该如何选型?
使用uIP堆栈将MAXQ微控制器联网
努比亚Z17S评测 诠释全面屏真正含义
光纤传感器概述
人员定位管理系统的应用场景:实现安全与效率的智能解决方案
投影画面偏色实例及应对方法
Google在“ 电话”应用中启动一项称为“ 已验证电话”的新功能
红米Redmi与抖音展开战略合作首款新机即将发布
针式打印机的打印针寿命
SQL优化的一般步骤与案例分析
半导体行业未来发展方向究竟是什么?