一、环境概述
在虚拟机上运行的Ubuntu 18.04 64位操作系统搭配了OpenCV 3.4.9和QT 5.12版本。关于在Ubuntu上编译OpenCV的详细步骤,请参考链接:https://www.php.cn/link/1c1f1beef683946794edf22079849283。
二、创建QT工程并集成OpenCV库
以下提供了一个简单的示例,利用OpenCV内置的分类器对图像进行人脸检测并标记。
OpenCV源码中的人脸检测分类器位于:opencv-3.4.9/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml。
xxx.pro项目文件如下:
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \ main.cpp \ widget.cpp
HEADERS += \ widget.h
FORMS += \ widget.ui
qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
linux { 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/opencv2
LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_calib3d.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_core.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_dnn.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_features2d.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_flann.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_highgui.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_imgcodecs.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_imgproc.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_ml.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_objdetect.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_photo.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_shape.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_stitching.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_superres.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_videoio.so LIBS += /home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_video.so}
widget.cpp文件内容如下:
#include "widget.h"include "ui_widget.h"
Widget::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}} }; 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, cvSize(30,30)); t = (double)cvGetTickCount() - t; fprintf( stderr, "start------------------------------>3 \n" ); for(int i=0; i < objects->total; ++i) { CvRect r = (CvRect)cvGetSeqElem(objects,i); cvRectangle(img, cvPoint(r->xscale,r->yscale), cvPoint((r->x+r->width)scale,(r->y+r->height)scale), colors[i%8]); } fprintf( stderr, "start------------------------------>4 \n" ); for( int i = 0; i < objects->total; i++ ) { CvRect r = (CvRect)cvGetSeqElem( objects, i ); CvPoint center; int radius; center.x = cvRound((r->x + r->width0.5)scale); center.y = cvRound((r->y + r->height0.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) { uchar imgData = (uchar *)img->imageData; QImage my_image(imgData,img->width,img->height,QImage::Format_RGB888); my_image = my_image.rgbSwapped(); QPixmap my_pix; my_pix.convertFromImage(my_image); ui->label_display_face->setPixmap(my_pix); }
widget.h文件内容如下:
#ifndef WIDGET_Hdefine WIDGET_H
include
include
include
include
QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE
class Widget : public QWidget { Q_OBJECT
public: Widget(QWidget parent = nullptr); ~Widget(); void opencv_face(); void show_face(IplImage img);
private: Ui::Widget *ui; };
endif // WIDGET_H
运行上述代码后,人脸检测结果展示如下:











