windows下Qt調用opencv完成目標檢測

      網友投稿 1144 2025-04-03

      一、前言


      OpenCV是開源的計算機視覺、機器學習軟件庫,其圖片處理的功能非常強大,并且速度很快。

      作為目標檢測功能,OpenCV里本身就自帶了很多的模型,比如: 人眼檢測、鼻子檢測、嘴巴檢測、人臉檢測、人體檢測、貓臉檢測等等,下載完OpenCV,就能直接進行圖像識別測試體驗,并且OpenCV也可以直接調用YOLO的模型,精確識別各種物體,yolo v3 里自帶的模型文件可以精確識別常見的很多物體: 比如: 狗、汽車、自行車、人體、書本、手機等等。

      這篇文章就介紹在Qt里如何部署opencv環境,完成目標物體檢測。

      二、部署OpenCV開發環境

      首先介紹我的開發環境:

      我分別使用常用的兩種編譯器部署OpenCV環境。

      MSVC 2017 64位

      MinGW 730 32位

      OpenCV的官網-: https://opencv.org/releases/page/3/

      OpenCV 在2.X版本的時候還有x86的庫,從3.X版本開始就只有x64的庫,并且只是支持MSVC編譯器。

      目前我使用的OpenCV版本是: OpenCV 3.4.7

      -就是上面的地址,直接向下翻就可以找到這個版本。

      下載下來是一個exe文件,雙擊就可以安裝,實際就是解壓,可以選擇解壓的路徑,解壓出來的文件包含源文件、庫文件一大堆,比較大,可以直接放在一個固定的目錄,后面程序里直接填路徑來調用即可。 這個下載下來的庫文件里只包含了X64的庫,適用于MSVS 64位編譯器。

      如果是MinGw編譯器,可以從這里https://github.com/huihut/OpenCV-MinGW-Build下載對應的OpenCV庫進行使用。

      GitHub的地址在CodeChina有鏡像,可以從這里去下載,速度比較快:https://gitcode.net/mirrors/huihut/opencv-mingw-build?utm_source=csdn_github_accelerator

      打開鏈接后,自己去選擇適合自己編譯器的版本,我的MinGW是730剛好就使用下面這個版本。

      下面分別介紹VS2017 64位編譯器和MinGW 32位編譯器如何引用OpenCV的庫。

      MSVC 64位編譯器–QT的xx.pro工程文件里的寫法

      INCLUDEPATH += C:/opencv/build/include\ INCLUDEPATH += C:/opencv/build/include/opencv\ INCLUDEPATH += C:/opencv/build/include/opencv2 LIBS += -LC:/opencv/build/x64/vc14/lib\ -lopencv_world347d LIBS += -LC:/opencv/build/x64/vc14/lib\ -lopencv_world347

      MinGW 32位編譯器–QT的xx.pro工程文件里的寫法

      INCLUDEPATH+=C:/OpenCV-MinGW-Build-OpenCV-3.4.7/include \ C:/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv \ C:/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv2 LIBS+=C:/OpenCV-MinGW-Build-OpenCV-3.4.7/x86/mingw/bin/libopencv_*.dll

      工程編程成功之后,需要將OpenCV對應的dll文件拷貝到exe同級目錄,否則運行時找不到dll會導致程序異常結束。 這些dll文件就是在OpenCV的bin目錄下。

      三、調用OpenCV完成目標檢測(以人臉檢測為例)

      OpenCV自帶的模型文件在C:\opencv\sources\data\haarcascades_cuda 這個目錄下。

      windows下Qt調用opencv完成目標檢測

      這個就是人臉檢測模型文件:

      OpenCV完成目標檢測有兩種調用方法。

      3.1 方法1: cvHaarDetectObjects

      //人臉檢測代碼 void ImageHandle::opencv_face(QImage qImage) { QTime time; time.start(); static CvMemStorage* storage = nullptr; static CvHaarClassifierCascade* cascade = nullptr; //加載分類器:正面臉檢測 cascade = (CvHaarClassifierCascade*)cvLoad("C:/opencv/sources/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml", 0, 0, 0 ); if(!cascade) { qDebug()<<"分類器加載錯誤.\n"; return ; } //創建內存空間 storage = cvCreateMemStorage(0); //加載需要檢測的圖片 IplImage* img = QImageToIplImage(&qImage); if(img ==nullptr ) { qDebug()<<"圖片加載錯誤.\n"; return; } double scale=2; //創建圖像首地址,并分配存儲空間 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); //直方圖均衡 /* * 指定相應的人臉特征檢測分類器,就可以檢測出圖片中所有的人臉,并將檢測到的人臉通過矩形的方式返回。 * 總共有8個參數,函數說明: 參數1:表示輸入圖像,盡量使用灰度圖以加快檢測速度。 參數2:表示Haar特征分類器,可以用cvLoad()函數來從磁盤中加載xml文件作為Haar特征分類器。 參數3:用來存儲檢測到的候選目標的內存緩存區域。 參數4:表示在前后兩次相繼的掃描中,搜索窗口的比例系數。默認為1.1即每次搜索窗口依次擴大10% 參數5:表示構成檢測目標的相鄰矩形的最小個數(默認為3個)。如果組成檢測目標的小矩形的個數和小于 min_neighbors - 1 都會被排除。如果min_neighbors 為 0, 則函數不做任何操作就返回所有的被檢候選矩形框,這種設定值一般用在用戶自定義對檢測結果的組合程序上。 參數6:要么使用默認值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果設置為CV_HAAR_DO_CANNY_PRUNING,那么函數將會使用Canny邊緣檢測來排除邊緣過多或過少的區域,因此這些區域通常不會是人臉所在區域。 參數7:表示檢測窗口的最小值,一般設置為默認即可。 參數8:表示檢測窗口的最大值,一般設置為默認即可。 函數返回值:函數將返回CvSeq對象,該對象包含一系列CvRect表示檢測到的人臉矩形。 */ CvSeq* objects = cvHaarDetectObjects(small_img, cascade, storage, 1.1, 3, 0/*CV_HAAR_DO_CANNY_PRUNING*/, cvSize(50,50)/*大小決定了檢測時消耗的時間多少*/); qDebug()<<"人臉數量:"<total; //遍歷找到對象和周圍畫盒 QPainter painter(&qImage);//構建 QPainter 繪圖對象 QPen pen; pen.setColor(Qt::blue); //畫筆顏色 pen.setWidth(5); //畫筆寬度 painter.setPen(pen); //設置畫筆 for(int i=0;i<(objects->total);++i) { //得到人臉的坐標位置和寬度高度信息 CvRect* r=(CvRect*)cvGetSeqElem(objects,i); //將人臉區域繪制矩形圈起來 painter.drawRect(r->x*scale,r->y*scale,r->width*scale,r->height*scale); } cvReleaseImage(&gray); //釋放圖片內存 cvReleaseImage(&small_img); //釋放圖片內存 cvReleaseHaarClassifierCascade(&cascade); //釋放內存-->分類器 cvReleaseMemStorage(&objects->storage); //釋放內存-->檢測出圖片中所有的人臉 //釋放圖片 cvReleaseImage(&img); qDebug()<width(); int height = qImage->height(); CvSize Size; Size.height = height; Size.width = width; IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { QRgb rgb = qImage->pixel(x, y); CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+0 ) = qBlue(rgb); CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+1 ) = qGreen(rgb); CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+2 ) = qRed(rgb); } } return IplImageBuffer; }

      3.2 方法2: face_cascade.detectMultiScale

      //人臉檢測代碼 void ImageHandle::opencv_face(QImage qImage) { QTime time; time.start(); //定義級聯分類器 CascadeClassifier face_cascade; //加載分類文件 if(!face_cascade.load("C:/opencv/sources/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml") ) { qDebug()<<"分類器加載錯誤"; return; } Mat frame=QImage2cvMat(qImage); cvtColor(frame, frame, COLOR_BGR2GRAY );//轉換成灰度圖像 std::vector faces; //正臉檢測 face_cascade.detectMultiScale(frame,faces); qDebug()<

      OpenCV Qt Windows

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:vs2017 因軟鏈接失效而無法進入安裝界面的解決方法
      下一篇:通過移動設備管理體驗最高安全性
      相關文章
      亚洲成人免费在线| 精品国产日韩亚洲一区| 国产成人高清亚洲| 亚洲欧美国产国产综合一区| 亚洲国产片在线观看| 亚洲午夜精品一区二区公牛电影院| 亚洲人成在线影院| 亚洲视频在线播放| 337p日本欧洲亚洲大胆精品555588 | 久久亚洲中文无码咪咪爱| 亚洲免费综合色在线视频| 亚洲熟妇无码一区二区三区| 亚洲乱码无人区卡1卡2卡3| 亚洲熟妇成人精品一区| 精品无码专区亚洲| 亚洲无码视频在线| 亚洲人JIZZ日本人| 亚洲国产精品无码久久一线| 久久久久亚洲精品成人网小说| 亚洲男人第一av网站| 亚洲成人网在线观看| 亚洲制服丝袜第一页| 亚洲丰满熟女一区二区哦| 国产成人久久精品亚洲小说| 亚洲中文字幕视频国产| 亚洲人成人网站色www| 内射少妇36P亚洲区| 亚洲午夜精品在线| 亚洲av无码无线在线观看| 亚洲国产aⅴ综合网| 亚洲情综合五月天| 久久精品亚洲中文字幕无码麻豆| 亚洲人成日本在线观看| 亚洲欧洲av综合色无码| va亚洲va日韩不卡在线观看| 中文字幕亚洲乱码熟女一区二区 | 亚洲va久久久噜噜噜久久天堂| 中文字幕在线观看亚洲| 国产精品亚洲四区在线观看| 性色av极品无码专区亚洲 | 亚洲国产精品张柏芝在线观看|