2017-08-25 2 views
1

J'ai un peu de mal à essayer de faire fonctionner la détection de face opencv dans QT avec ma caméra basler; J'ai essayé de nombreuses approches différentes pour le faire fonctionner, en utilisant de nombreux codes d'échantillons différents en ligne. Je n'arrive tout simplement pas à le faire fonctionner; De plus, les tentatives que j'ai faites ont diminué mon taux de trame.Comment et où implémenter le code de détection de face opencv en utilisant basler cam avec QT

Le code que j'ai utilisé pour capturer une vidéo avec la caméra basler fonctionne très bien, j'ai juste du mal à implémenter la partie de détection de visage. Je vais coller le code que j'ai jusqu'ici pour la caméra et l'opencv ci-dessous. Le code me fait apparaître quelques boîtes rouges de temps en temps, mais ce n'est pas stable. Je reçois également cette erreur

Failed to load OpenCL runtime 

Je ne suis pas sûr de ce que je fais mal, est-il un moyen de mettre en œuvre la détection de visage sans abaisser le taux de trame, car il est déjà lent

#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(); 
            } 
} 

        } 


} 
} 

Merci

+0

Avez-vous essayé cette ?: https://stackoverflow.com/questions/25723059/failed-to-load-opencl -runtime-opencv3-python – Rama

Répondre

0

je ne suis pas tout à fait sûr de cela, mais detectMultiScale fonction fonctionne avec l'image dans le type de cv_8u, et que je vois que vous utilisez cv_8uc3, comme je sais cv_8u il est 8 pixel bits avec 1 canal, cv_8uc3 c'est alos 8 bits mais 3 canaux, vous devez convertir votre image en échelle de gris, je vous ai vu faire mais vous le commentez? regardez ce lien opencv_face_detection.

peut-être qui va résoudre votre problème, et quelques conseils de personnes que vous installer OpenCL

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