Last active
August 3, 2017 21:35
-
-
Save d-demirci/76e6dc8b014d9754c5d3ba2f55093f3d to your computer and use it in GitHub Desktop.
OpenCv-Cuda-Ubuntu haarcascade_frontalface_alt.xml accuracy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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