如何以及在何处使用带有 QT 的 basler 相机实现 opencv 人脸检测代码

Posted

技术标签:

【中文标题】如何以及在何处使用带有 QT 的 basler 相机实现 opencv 人脸检测代码【英文标题】:How and where to implement opencv face detecion code using basler cam with QT 【发布时间】:2018-02-03 14:03:36 【问题描述】:

我在尝试使用我的 basler cam 让 opencv 人脸检测在 QT 中工作时遇到了一些麻烦;我已经尝试了许多不同的方法来让它工作,在线使用许多不同的示例代码。我似乎根本无法让它工作。此外,我所做的尝试降低了我的帧速率。

我用来使用 basler cam 捕捉视频的代码运行良好,只是在实现人脸检测部分时遇到了问题。我将在下面粘贴我目前为相机和 opencv 提供的代码。该代码确实让我时不时出现一些红色框,但它并不稳定。我也遇到这个错误

Failed to load OpenCL runtime

我不确定我做错了什么,还有没有办法在不降低帧速率的情况下实现人脸检测,因为它已经很慢了

  #include "mainwindow.h"
#include "ui_mainwindow.h"

#include <opencv2/opencv.hpp>

#include <pylon/PylonIncludes.h>
//#include <pylon/PylonGUI.h>
//#ifdef PYLON_WIN_BUILD
//#include <pylon/PylonGUI.h>
//#endif

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include<time.h>
#include<stdlib.h>


using namespace cv;

// Namespace for using pylon objects.
using namespace Pylon;


// Namespace for using cout.
using namespace std;


static const uint32_t c_countOfImagesToGrab = 100;


cv::CascadeClassifier faceCade;

String faceCascadeName = "/usr/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml";
String FaceDetectWindow = "Face Detector Window";
String FaceDetectGrayWindow = "Face Detector Gray Window";
size_t i;

vector<Rect> faces;

  cv::Mat camFrames, grayFrames;

int main()



    // The exit code of the sample application.
    int exitCode = 0;

    // Automagically call PylonInitialize and PylonTerminate to ensure
    // the pylon runtime system is initialized during the lifetime of this object.
    Pylon::PylonAutoInitTerm autoInitTerm;

faceCade.load( faceCascadeName );

    CGrabResultPtr ptrGrabResult;
    namedWindow("CV_Image",WINDOW_AUTOSIZE);



        CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
          cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl;
           camera.Open();

           GenApi::CIntegerPtr width(camera.GetNodeMap().GetNode("Width"));
               GenApi::CIntegerPtr height(camera.GetNodeMap().GetNode("Height"));
               Mat cv_img(width->GetValue(), height->GetValue(), CV_8UC3);

               camera.StartGrabbing();
                  CPylonImage image;
                  CImageFormatConverter fc;
                   fc.OutputPixelFormat = PixelType_BGR8packed;

                   while(camera.IsGrabbing())
                      camera.RetrieveResult( 5000, ptrGrabResult, TimeoutHandling_ThrowException);
if (ptrGrabResult->GrabSucceeded())

    fc.Convert(image, ptrGrabResult);


                   cv_img = cv::Mat(ptrGrabResult->GetHeight(),     ptrGrabResult->GetWidth(), CV_8UC3,(uint8_t*)image.GetBuffer());





                   //cvtColor(cv_img, grayFrames, cv::COLOR_BGR2GRAY);
                    //equalizeHist(grayFrames, grayFrames);
                    faceCade.detectMultiScale(cv_img, faces, 1.1, 2, 0, Size(160, 160));




                    for (int i = 0; i < faces.size(); i++)
                  
                        //Mat faceROI = grayFrames(faces[i]);
                        rectangle(cv_img, Rect(faces[i].x - 25,faces[i].y - 25,faces[i].width + 35 ,faces[i].height + 35),  Scalar(0, 0, 255), 1, 1, 0);
                        Point center(faces[i].x + faces[i].width * 0.5,faces[i].y + faces[i].height * 0.5);






                   imshow("CV_Image",cv_img);
                   //imshow("FaceDetectGrayWindow", grayFrames);
                     waitKey(1);
                     if(waitKey(30)==27)
                                          camera.StopGrabbing();
                                    


                   




谢谢

【问题讨论】:

你试过了吗?:***.com/questions/25723059/… 【参考方案1】:

我对此不太确定,但detectMultiScale 函数适用于 cv_8u 类型的图像,并且我看到您使用的是 cv_8uc3,据我所知 cv_8u 它是 8 位像素,有 1 个通道,cv_8uc3 它是 8 位但3通道,你需要把你的图像转换成灰度,我看到你这样做了,但你评论了?!!! 看看这个链接opencv_face_detection。

也许这会解决你的问题,有些人建议你安装 opencl

sudo apt-get install ocl-icd-opencl-dev

【讨论】:

以上是关于如何以及在何处使用带有 QT 的 basler 相机实现 opencv 人脸检测代码的主要内容,如果未能解决你的问题,请参考以下文章

"Qt Qtwebengineprocess已停止工作",该如何处理

Qt Qtwebengineprocess已停止工作,该如何处理

如何在 Qt 中使用彩色字符串设置窗口标题?

将ZMQ事件循环与QT / Pyforms事件循环相结合

仅包含带有程序的最小 Qt 库

如何快速连接Basler工业摄像头,获取并保存图像和视频(python+opencv+pypylon)