Перейти к содержимому
Compvision.ru
Сергей Александрович

Выделение лица на снимке от тепловизора

Recommended Posts

Единственная проблема данный способ надо перевести на видеопоток. Чтоб при съемки с тепловизера производилась детекция. Да кстати я в программирование не силен может кто поможет перевести все это WinForm.

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include <math.h>

#include <float.h>

#include <limits.h>

#include <time.h>

#include <ctype.h>



// Создаем строку, содержащую точное имя каскад

const char* cascade_name =

    "E:/haarcascade_frontalface_alt.xml";

/*    "haarcascade_profileface.xml";*/



// Прототип функции для обнаружения и рисования объект из изображения

void detect_and_draw( IplImage* image );


// Основные функции, определяет точку входа в программу.

int main( int argc, char** argv )

{


    // Создаем пример изображения

    IplImage *img = cvLoadImage("E:/14.bmp");


    //Вызов этой функции для обнаружения и нарисования лица

    detect_and_draw(img);


    // Ожидание ввода пользователя перед выходом из программы

    cvWaitKey();


    cvReleaseImage(&img);


    // Уничтожим окно ранее созданных файла с именем: "Result"

    cvDestroyWindow("result");


    return 0;

}


// Функция обнаружения лица, которое присутствует в изображении

void detect_and_draw( IplImage* img )

{


    //Создаем память для расчетов

    static CvMemStorage* storage = 0;


    // Создаем новый классификатор Haar

    static CvHaarClassifierCascade* cascade = 0;


    int scale = 1;


    // Создаем новый образ, основанный на входном изображении

    IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );


    // Создаем две точки, представляющие местоположение лица

    CvPoint pt1, pt2;

    int i;


    // Загружаем HaarClassifierCascade

    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );


    // Проверяем, правильно ли каскад загрузился. 

    if( !cascade )

    {

        fprintf( stderr, "ОШИБКА: Не был загружен cascade\n" );

        return;

    }


    // Выделим память для хранения

    storage = cvCreateMemStorage(0);


    // Создаем новое имя окна с заголовком: «result»

    cvNamedWindow( "result", 1 );


    // Очистим хранилище памяти, который использовался до

    cvClearMemStorage( storage );


    // Найдем загрузился каскад, чтобы найти лица. Если да, то:

    if( cascade )

    {


        // Может быть более одного лица на изображении. Так, чтобы создать последовательность лица.

        // Определить объекты и хранить их в той последовательности

        CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,

                                            1.1, 2, CV_HAAR_DO_CANNY_PRUNING,

                                            cvSize(40, 40) );



        for( i = 0; i < (faces ? faces->total : 0); i++ )

        {

           // Создаем новый прямоугольник для рисования лица

            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );


            // Найдем размеры лица, и масштабы его, если необходимо,

            pt1.x = r->x*scale;

            pt2.x = (r->x+r->width)*scale;

            pt1.y = r->y*scale;

            pt2.y = (r->y+r->height)*scale;


            // Нарисуем прямоугольник, в входное изображение

            cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );

        }

    }


    // Показать изображения в окно "result"

    cvShowImage( "result", img );


        cvReleaseImage( &temp );

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С формами я не дружу.

Вот для потока (с использованием граф. карты (работает лучше и тормозов нет) . Графическая карта должна поддерживать CUDA.):


#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <direct.h>
#include "fstream"
#include "iostream"
#include <vector>
#include "opencv2/core/core.hpp"
#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;
using namespace cv::gpu;

cv::gpu::CascadeClassifier_GPU cascade_gpu;

//-------------------------------------------------------------------------------------------------------------
vector<Rect> detect_faces(Mat& image)
{
vector<Rect> res;
bool findLargestObject = true;
bool filterRects = true;
int detections_num;
Mat faces_downloaded;
Mat im(image.size(),CV_8UC1);
GpuMat facesBuf_gpu;
if(image.channels()==3)
{
cvtColor(image,im,CV_BGR2GRAY);
}
else
{
image.copyTo(im);
}
GpuMat gray_gpu(im);

cascade_gpu.visualizeInPlace = false;
cascade_gpu.findLargestObject = findLargestObject;
detections_num = cascade_gpu.detectMultiScale(gray_gpu, facesBuf_gpu, 1.2,(filterRects || findLargestObject) ? 4 : 0,Size(image.cols/4,image.rows/4));


if(detections_num==0){return res;}

facesBuf_gpu.colRange(0, detections_num).download(faces_downloaded);
Rect *faceRects = faces_downloaded.ptr<Rect>();

for(int i=0;i<detections_num;i++)
{
res.push_back(faceRects[i]);
}
gray_gpu.release();
facesBuf_gpu.release();
return res;
}
//-----------------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------
// MAIN
//----------------------------------------------------------------------
int main(int argc, char * argv[])
{
cv::gpu::printShortCudaDeviceInfo(cv::gpu::getDevice());
cascade_gpu.load("haarcascade_frontalface_alt2.xml");
setlocale(LC_ALL, "Russian");
Mat frame,img;
namedWindow("frame");
VideoCapture capture(0);
capture >> frame;
vector<Rect> rects;
if (capture.isOpened())
{
while(waitKey(20)!=27) // Выход по escape
{
capture >> frame;
cvtColor(frame,img,CV_BGR2GRAY);
rects=detect_faces(img);
if(rects.size()>0)
{
cv::rectangle(frame,rects[0],CV_RGB(255,0,0));
}
imshow("frame",frame);
}
}

return 0;
}[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мне лучше данный способ нахождения лица использовать так как только он у меня выделяет лицо на термограмме. Да еще не очень силен в программирование и мне как нибудь все это вывести на WIN FORM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поиск лица в видеопотоке с Вашей функцией:

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdarg.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "cvlabeling_imagelab.h"
#include "fstream"
#include "iostream"
using namespace std;
using namespace cv;

// Указатель на каскад Хаара
static CvHaarClassifierCascade* cascade = 0;
// Функция обнаружения лица, которое присутствует в изображении
void detect_and_draw( IplImage* img )
{
//Создаем память для расчетов
static CvMemStorage* storage = 0;
int scale = 1;
// Создаем новый образ, основанный на входном изображении
IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );
// Создаем две точки, представляющие местоположение лица
CvPoint pt1, pt2;
int i;
// Проверяем, правильно ли каскад загрузился.
if( !cascade )
{
fprintf( stderr, "ОШИБКА: Не был загружен cascade\n" );
return;
}

// Выделим память для хранения
storage = cvCreateMemStorage(0);

// Очистим хранилище памяти, который использовался до
cvClearMemStorage( storage );

// Найдем загрузился каскад, чтобы найти лица. Если да, то:
if( cascade )
{

// Может быть более одного лица на изображении. Так, чтобы создать последовательность лица.
// Определить объекты и хранить их в той последовательности
CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
cvSize(40, 40) );


for( i = 0; i < (faces ? faces->total : 0); i++ )
{
// Создаем новый прямоугольник для рисования лица
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );

// Найдем размеры лица, и масштабы его, если необходимо,
pt1.x = r->x*scale;
pt2.x = (r->x+r->width)*scale;
pt1.y = r->y*scale;
pt2.y = (r->y+r->height)*scale;

// Нарисуем прямоугольник, в входное изображение
cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
}
}

// Показать изображения в окно "result"
cvShowImage( "result", img );
cvReleaseImage( &temp );
}

//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
// Создаем строку, содержащую точное имя каскад
const char* cascade_name ="E:/haarcascade_frontalface_alt.xml";
// Загружаем HaarClassifierCascade
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
// Создаем новое имя окна с заголовком: «result»
cvNamedWindow( "result", 1 );
CvCapture* capture=0;
capture = cvCaptureFromCAM(0);
IplImage *frame=0;
while(cvWaitKey(10)!=27)
{
if( !cvGrabFrame( capture ))
{
goto skip;
}
frame = cvRetrieveFrame(capture);
detect_and_draw( frame );
skip:;
}
return 0;
}
[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×