Skip to content

Instantly share code, notes, and snippets.

@d-demirci
Last active August 3, 2017 21:35
Show Gist options
  • Save d-demirci/76e6dc8b014d9754c5d3ba2f55093f3d to your computer and use it in GitHub Desktop.
Save d-demirci/76e6dc8b014d9754c5d3ba2f55093f3d to your computer and use it in GitHub Desktop.
OpenCv-Cuda-Ubuntu haarcascade_frontalface_alt.xml accuracy
#include <iostream>
#include <vector>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/opencv_modules.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <opencv2/cudaimgproc.hpp>
using namespace cv;
using namespace std;
#define isGPU (true)
#define __DEBPRINT__ (true)
#define __SHOWFRAMENO__ (true)
#define __SHOWRECTSIZE__ (true)
#define __SHOWFACECOUNTER__ (true)
#define __SHOWFACECOUNTER__ (true)
#define STRLEN_FOR_INFORMATION (1024)
/* Global variables */
String face_cascade_file = "haarcascade_frontalface_alt.xml";
String face_cascade_HAAR = "/mnt/opencv_compile/opencv/data/haarcascades_cuda/"+face_cascade_file;
String face_cascade_name1 = face_cascade_HAAR;
String window_name = "OPENCV-CUDA-Yuz Tespit";
int main(int argc,char* argv[])
{
//------------------------
// OpenCV Versiyonu.
//------------------------
cout << "OpenCV " << CV_VERSION << endl;
//------------------------
// Cascade Nesnesini oluşturup, yüz tespiti için yükliyoruz.
//------------------------
cout << "(" << face_cascade_name1 << ") dosyası kullanarak cascade sınıflandırma yapılacak." << endl;
//cpu cascade
Ptr<cv::CascadeClassifier> h_face_cascade;
//gpu cascade
Ptr<cuda::CascadeClassifier> d_face_cascade;
if (isGPU)
{
d_face_cascade = cv::cuda::CascadeClassifier::create(face_cascade_name1);
if (NULL == d_face_cascade)
{
cout << "Yüz cascade sınıflandırıcısı yüklenemedi." << endl;
return -1;
}
}
else
{
h_face_cascade = new CascadeClassifier();
if (NULL == h_face_cascade)
{
cout << "Yüz cascade sınıflandırıcısı yüklenemedi." << endl;
return -1;
}
bool bResult = h_face_cascade->load(face_cascade_name1);
if (!bResult)
{
cout << "Yüz cascade sınıflandırıcısı yüklenemedi." << endl;
return -1;
}
}
//------------------------
// Videomuzu seçelim.
//------------------------
//cpu frame
Mat h_colorframe;
String videoFilename = "/home/forensic/Downloads/obama_putin.mp4";
cout << "Dosya aciliyor.(" << videoFilename << ")." << endl;
VideoCapture capture;
capture.open(videoFilename);
if(capture.isOpened())
{
cout << "Dosya acildi" << endl;
int frameNum = capture.get(CAP_PROP_FRAME_COUNT);
int currentFrame;
int detectedFaceCounter = 0 ;
char* dispDetectedRect = (char*)malloc(STRLEN_FOR_INFORMATION * sizeof(char));
char* dispDetectedFaceCounter = (char*)malloc(STRLEN_FOR_INFORMATION * sizeof(char));
char* dispCurrentFrame = (char*)malloc(STRLEN_FOR_INFORMATION * sizeof(char));
char* dispDetectedFaceFile = (char*)malloc(STRLEN_FOR_INFORMATION * sizeof(char));
if (NULL == dispCurrentFrame)
{
cout << "Heap Doldu!!" << endl;
}
//------------------------
// Videoyu gösterecek pencere
//------------------------
namedWindow(window_name, WINDOW_AUTOSIZE);
setWindowProperty(window_name, WINDOW_GUI_EXPANDED, WINDOW_AUTOSIZE);
int initialPos = 0;
//------------------------
// CPU için gerekli nesneler
//------------------------
Mat h_colorframe_orj;
Mat h_grayframe;
std::vector<Rect> h_faces;
Mat h_colorframe;
//------------------------
// GPU için gerekli nesneler
//------------------------
cuda::GpuMat d_colorframe;
cuda::GpuMat d_grayframe;
cuda::GpuMat d_faces;
//------------------------
// Videoyu kaydı için dosyamız oluşturalım
//------------------------
VideoWriter video(face_cascade_file+".avi",CV_FOURCC('M','J','P','G'),10, Size(640,480));
//------------------------
// Frameler geldikçe tespite devam edelim.
//------------------------
for(;;)
{
capture >> h_colorframe_orj;
if(h_colorframe_orj.empty())
{
break;
}
//------------------------
// Aldığımız frame'in boyutunu küçültüyoruz, griye çevirip, histogramı eşitliyoruz.
//------------------------
//boyut küçültürken INTER_AREA kullandık, siz isterseniz INTER_CUBIC kullanın
//ama INTER_AREA'nın daha hızlı olduğunu düşünüyorum. (Benchmark yapmadım)
cv::resize(h_colorframe_orj, h_colorframe, cv::Size(640, 480), 0, 0, cv::INTER_AREA);
if (isGPU)
{
//okuduğumuz frame'i gpu'ya veriyoruz.
d_colorframe.upload(h_colorframe);
cuda::cvtColor(d_colorframe, d_grayframe, CV_BGR2GRAY);
cuda::equalizeHist(d_grayframe, d_grayframe);
}
else
{
cvtColor(h_colorframe, h_grayframe, CV_BGR2GRAY);
equalizeHist(h_grayframe, h_grayframe);
}
#if __DEBPRINT__
cout << "Frame gri'ye çevrildi ve eşitlendi." << endl;
#endif
//------------------------
// Yüzleri tespit edelim.
//------------------------
try
{
if (isGPU)
{
d_face_cascade->detectMultiScale(d_grayframe, d_faces);
// d_face_cascade->detectMultiScale(d_grayframe, d_faces, 1.05, 3, 0, Size(10, 10), Size(500, 500));
// tespit ettiğimiz yüzleri cpu'da kullanabilmek için dönüştürelim
d_face_cascade->convert(d_faces, h_faces);
}
else
{
h_face_cascade->detectMultiScale(h_grayframe, h_faces);
h_face_cascade->detectMultiScale(h_grayframe, h_faces, 1.1, 3, 0, Size(30, 30), Size(500, 500));
}
#if __DEBPRINT__
cout << "Tespit Tamamlandı" << endl;
#endif
// Tespit edilen yüzlerin çevresini işaretleyelim.
for (size_t i = 0; i < h_faces.size(); i++)
{
detectedFaceCounter += 1 ;
#if __SHOWRECTSIZE__
sprintf(dispDetectedRect, "x,y = %4d, %4d", h_faces[i].width, h_faces[i].height);
putText(h_colorframe, dispDetectedRect,
Point(h_faces[i].x, h_faces[i].y - 10),
FONT_ITALIC , 0.5, // yazı tipi-boyutu
Scalar(255, 0, 255), // renk
1, LINE_AA); // çizgi kalınlığı ve tipi
#endif
#if __SHOWFACECOUNTER__
sprintf(dispDetectedFaceCounter, "Yuz Sayisi : %4d", detectedFaceCounter);
putText(h_colorframe, dispDetectedFaceCounter,
Point(h_faces[i].x, h_faces[i].y - 25),
FONT_ITALIC , 0.5, // yazı tipi-boyutu
Scalar(255, 0, 155), // renk
1, LINE_AA); // çizgi kalınlığı ve tipi
#endif
rectangle(h_colorframe, h_faces[i], Scalar( 255, 0, 255 ), 4, 8, 0 );
#if __SHOWFACECOUNTER__
//char* face_cascade_part = face_cascade_file.c_str();
cv::Mat subFrame;
h_colorframe(h_faces[i]).copyTo(subFrame);
cv::Mat resizedFrame;
cv::resize(subFrame, resizedFrame, cv::Size(100, 100), 0, 0, cv::INTER_AREA);
sprintf(dispDetectedFaceFile, "%s_folder/resim_%d.png", face_cascade_file.c_str(),detectedFaceCounter);
imwrite(dispDetectedFaceFile, resizedFrame);
#endif
}
//------------------------
// Sonucu gösterelim.
//------------------------
Mat result = h_colorframe;
#if __SHOWFRAMENO__
currentFrame = capture.get(CV_CAP_PROP_POS_FRAMES);
sprintf(dispCurrentFrame, "Frame Numarasi. : %08d", currentFrame);
if (isGPU)
{
strcat(dispCurrentFrame, " Mod : GPU");
}
else
{
strcat(dispCurrentFrame, " Mod : CPU");
}
putText(result, dispCurrentFrame,
Point(20, 460),
FONT_ITALIC , 0.5,
Scalar(255, 255, 255),
1, LINE_AA);
#endif
imshow(window_name, result);
video.write(result);
int keyCode = waitKey(1);
if (keyCode != -1)
{
if ((char)keyCode == 'p')
{
putText(result, "DURDU",
Point(200, 300),
FONT_ITALIC , 2,
Scalar(0, 0, 255),
3, LINE_AA,false);
imshow(window_name, result);
waitKey(0);
}
else if ((char)keyCode == 'q')
{
break;
}
else
{
char dispKeyCode[64];
sprintf(dispKeyCode, "Tus Kodu : %04d", keyCode);
putText(result, dispKeyCode,
Point(50, 50),
FONT_ITALIC , 1,
Scalar(0, 0, 255),
3, LINE_AA);
imshow(window_name, result);
}
}
}
catch (Exception& e)
{
cout << e.msg << endl;
}
}
video.release();
}
else
{
cout << "Okunamadi" << endl;
h_colorframe = Mat::zeros(480, 640, CV_8UC1);
putText(h_colorframe, "Okunamadi",
Point(20, 20),
FONT_ITALIC , 1,
Scalar(0, 0, 255),
3, LINE_AA);
imshow("Bos", h_colorframe);
waitKey(0);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment