Перейти к содержимому
Compvision.ru

JoQeR

Пользователи
  • Количество публикаций

    39
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем JoQeR


  1. Ребят! Всем огромнейшее спасибо за помощь и ответы на вопросы) Во многом благодаря этому форуму, сегодня защитил на отлично дипломный проект с темой "авторизации пользователя ИС с помощью веб-камеры") Отдельное спасибо главному админу :thumbsu: Надеюсь, форум будет развиваться и подчерпну еще много нового от сюда)


  2. To Flame. На хабре прочитал статью, интересно, но решил, что взять и установить порог по расстоянию Махаланобиса и не ваять сложный велосипед (реализация есть в с++ на том же хабре + ссылку здесь выкладывали на полное руководство). Очень хотелось поэксперементить)


  3. Я для эксперемента яндекс картинки пробовал искать , лица", "лицо человека", там конечно много ереси вылезает. В основном звезды. Кстати, насчет звезд, на кинопоиске куча фотографий хорошего качества звезд)


  4. Реализовал все это дело, чисто порогом расстояния) Но точность распознавания, т.е. сам этот порог жутко зависит от совещения( Может есть какие то моменты и нюансы, чтобы лучше справлялся алгоритм собственными средствами?


  5. Flame. В статье Распознавание с помощью PCA делается на Евклидовом расстоянии. Но в конце указывается что изменить, чтобы использовать расстояние Махаланобиса. Вот кусок этого текста:

    Improving Eigenface

    Having a framework like this for training and testing will make it easier for you to add improvements to Eigenface and to test their effects.

    One of the first improvements you might want to add is to change the way distance is measured. The original eigenface paper used Euclidean distances between points, and that's the distance basis I've used in findNearestNeighbors(). But a different basis, called Mahalanobis distance (after its inventor) usually gives better results.

    One of the things that happens when you project a face image onto the PCA subspace is that each dimension receives a certain amount of stretch. The amount of stretch isn't the same, though, in every direction. The directions that correspond to the largest eigenvalues get stretched far more than the directions associated with smaller eigenvalues. Because Euclidean distance ignores this stretching, using it to measure distance is approximately the same as using only one eigenvector and ignoring the rest!

    It's easy to switch from Euclidean to Mahalanobis distance. Just change line 15, in findNearestNeighbors(), from

    distSq += d_i*d_i;

    to

    distSq += d_i*d_i/eigenValMat->data.fl;

    Switching to Mahalanobis distance eliminates the mismatch error mentioned above, bringing recognition accuracy up to 100% for these three subjects.


  6. timer1->Stop(); <-- это у меня остановка таймера, который отвечает за воспроизведение кадров в pictureBox.

    Спаибо за ответ, очень похоже что у меня как раз эта проблема. Но т.к. я еще новичек в этом деле, особенно с таймерами. Что есть функция обратного вызова у таймера Windows Forms? У системного таймера есть такая функция.


  7. Эх, а что ж делать с моим багом при релизной версии?

    Может туплю п острашному.

    Нашел еще один момент.

    Для того чтоб получить при фотографировании картинку качества получше, увеличиваю разрешение считываемого кадра, т.к. видео с камеры отображается в миниатюрном окошке, если убрать это изменение кадра, то все работает, но фото конечно отстойного качества. Может надо как то оптимизировать эту задачу? Хотя все тоже - на ноуте работает с любыми настройками.

    
                                     timer1->Stop();//
    
    
    				 Counter = 0; //счетчик времени для показа "Данные записаны в БД"
    
    
    				 //BuffCount =0;
    
    
                                     cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1280); 
    
    				 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 1024);
    
    
    				 frame = cvQueryFrame( capture );
    
    
    				 //-------/возврат к миниатюрному изображению/-----------//
    
    				 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, WidthFrame); 
    
    			         cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, HieghtFrame);
    
    
    

    Спасибо еще раз, за ваши ответы!


  8. Нет, в отладочной версии еще при запуске "Возникла точка останова" и на ноуте и на компе. Но я отладочную версю запускал с библиотеками OpenCV для релизной версии. Может из-за этого?

    Я еще думал что мож из-за фреймворка такое может быть каким то образом? Хотя и на ноутбуке и на компьютере ставился новый 4,5 вроде со студией. Приложение я пытаюсь сделать на 3-м фреймворке. Реально уже не знаю, что придумать.

    Еще есть такое, что без нахождения лица работает стабильно. Может слишком много дейсвий при нажатии кнопки происходит и 32-х разрядная система не справляется? Хотя вроде ересь.


  9. Нужен совет! Последния два дня меня убивает непонятная вещь, а именно виснет приложение, которое фотографирует, находит лицо ресайзит его и записывает в БД на компьютере. Причем оно виснет оно самым странным образом.

    1)Запускаю приложение. При этом сразу отображается видео с камеры на форму.

    2)Нажимаю кнопку сфотографировать.

    3)Находит лицо.

    4)Фотографирует, ресайзит и сохраняет в БД все успешно.

    5)Видео продолжает отображаться и вроде все впорядке. Можно даже нажать "Закрыть" и все закроется как надо.

    НО

    6) Если взять окно и попробовать перетащить его, сразу же "Завершена работа программы.." и "Widows ищет поиск решения данной проблемы.."

    Еще одно - на ноутбуке все работает замечательно, ничего подобного не происходит. Практически всё идентично: ОС Windows 7, MS Visual Studio 2010, MS SQL 2008, разве что на ноутбуке стоит 64-х разрядная система.

    Думал, что может из-за веб камеры. Но поставил камеру с компьютера на ноутбук, там и с этой камерой все работает прекрасно.

    К тому же иногда работает все прекрасно и на компьютере. В связи с чем такое может быть, куда смотреть, что делать даж не знаю. Может у кого то были подобные проблемы?

    Спасибо за ваши ответы!


  10. Добрый день, у меня вопрос я повторил программу cascade-classifier

    вообщем то всё работает ниже приведён текст программы, но она очень сильно тормозит т.е. каждый кадр обрабатывается долго, в программе по ссылке я так понимаю программа работает в реальном времени.. в моей же версии она очень сильно тормозит...

    
    // testdetect.cpp: определяет точку входа для консольного приложения.
    
    //
    
    #include "stdafx.h"
    
    
    #include <opencv2\core\core.hpp>
    
    #include <opencv2\highgui\highgui.hpp>
    
    #include <opencv2\imgproc\imgproc.hpp>
    
    #include <opencv2\ml\ml.hpp>
    
    #include <opencv2\features2d\features2d.hpp>
    
    #include <opencv2\objdetect\objdetect.hpp>
    
    #include <opencv2\video\tracking.hpp>
    
    
    #include <Windows.h>
    
    #include <string.h>
    
    #include <iostream>
    
    #include <stdio.h>
    
    #include <math.h>
    
    
    using namespace cv;
    
    using namespace std;
    
    
    #define MAX(a, ((a< ? b : a);
    
    #define MIN(a, ((a< ? a : ;
    
    
    String face_cascade_name = "haarcascade_frontalface_alt.xml";
    
    String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
    
    String window_name = "tracing face";
    
    CascadeClassifier face_cascade;
    
    CascadeClassifier eyes_cascade;
    
    
    void detectAndDisplay( Mat frame )
    
    {
    
      vector<Rect> faces;
    
      Mat frame_gray;
    
    
      cvtColor( frame, frame_gray, CV_BGR2GRAY );
    
      equalizeHist( frame_gray, frame_gray );
    
    
      //-- Detect faces
    
      face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
    
    
      for( int i = 0; i < faces.size(); i++ )
    
      {
    
        Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
    
        ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
    
    
        Mat faceROI = frame_gray( faces[i] );
    
        std::vector<Rect> eyes;
    
    
        //-- In each face, detect eyes
    
        eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
    
    
        for( int j = 0; j < eyes.size(); j++ )
    
         {
    
           Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
    
           int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
    
           circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
    
         }
    
      }
    
      //-- Show what you got
    
      imshow( window_name, frame );
    
     }
    
    
    int _tmain(int argc, char** argv)
    
    {
    
    	VideoCapture cap;
    
    	cap.open("video.mp4");
    
    
    	face_cascade.load(face_cascade_name);
    
    	eyes_cascade.load(eyes_cascade_name);
    
    
    	if(!cap.isOpened()) return -1;
    
    
    	while(true)
    
    	{
    
    		Mat frame;
    
                    cap >> frame;
    
    		if(frame.empty()) break;		
    
    		detectAndDisplay( frame );
    
    		//imshow("video",frame);
    
    		char c = waitKey(10);
    
    		if(c==27) break;
    
    	}
    
    
    	return 0;
    
    }
    
    [/code]
    
    
    
    
    
    
    Значительно повысить производительность поможет подбор параметров, но скорее снизит качество детектирования. Нужно найти оптимальный оптимум.
    
    Здесь поувеличивай масштаб "1,1" или окошко скана не 30х30, а примерно 60х60.
    
    
    //-- Detect faces face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
    Привожу пример подобного кода, только с выделением лица, без глаз.
    [code] // FaceDetectAndTrack.cpp #include <stdafx.h> #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <iostream> using namespace std; using namespace cv; void detectFace(IplImage *FaceIm); //Глобальные переменные CvSeq * pFaceRectSeq; // list of detected faces CvHaarClassifierCascade * pCascade; // каскад для нахождения лиц CvMemStorage * pStorage; // хранилище памяти int main( int argc, const char** argv ){ IplImage * pInpImg; const char* cascade_name = "haarcascade_frontalface_alt.xml"; pStorage = cvCreateMemStorage(0); pCascade = (CvHaarClassifierCascade *)cvLoad(cascade_name, 0, 0, 0 ); // initializations //* filename = argc == 2 ? argv[1] : "d:/StudentDetect1.jpg"; //IplImage * pInpImg = cvLoadImage(filename,1); //Проверка инициализируемых данных if( !pInpImg || !pStorage || !pCascade ){ printf("Initialization failed: %s \n", (!pInpImg)? "didn't load image file" : (!pCascade)? "didn't load Haar cascade -- " "make sure path is correct" : "failed to allocate memory for data storage"); exit(-1); } CvCapture *capture = cvCreateCameraCapture(CV_CAP_ANY); //CvCapture *capture = cvCreateCameraCapture(1); assert(capture); while(true){ pInpImg = cvQueryFrame( capture ); //Применяем функцию детектирования к каждому кадру detectFace(pInpImg); // показываем cvShowImage("Haar Window", pInpImg); char c = cvWaitKey(33); if (c == 27) { // нажата ESC break; } } // display face detections //cvShowImage("Haar Window", pInpImg); //cvWaitKey(0); //показываем результат в окне cvDestroyWindow("Haar Window"); //освобождаем все ресурсы cvReleaseImage(&pInpImg); if(pCascade) cvReleaseHaarClassifierCascade(&pCascade); if(pStorage) cvReleaseMemStorage(&pStorage); return 0; } void detectFace(IplImage *FaceIm){ int i; // Применяем функцию детектирования с заданными параметрами pFaceRectSeq = cvHaarDetectObjects (FaceIm, pCascade, pStorage, 1.2, // increase search scale by 10% each pass 6, // drop groups of fewer than three detections //CV_HAAR_DO_ROUGH_SEARCH //|CV_HAAR_SCALE_IMAGE CV_HAAR_DO_CANNY_PRUNING, // skip regions unlikely to contain a face cvSize(50,50)); // use XML default for smallest search scale // create a window to display detected faces cvNamedWindow("Haar Window", CV_WINDOW_AUTOSIZE); // draw a rectangular outline around each detection for(i=0;i<(pFaceRectSeq? pFaceRectSeq->total:0); i++ ){ CvRect * r = (CvRect*)cvGetSeqElem(pFaceRectSeq, i); CvPoint pt1 = { r->x, r->y }; CvPoint pt2 = { r->x + r->width, r->y + r->height }; cvRectangle(FaceIm, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0); } }


  11. Еще вопросик есть по этой теме. Для распознавания лица методом главных компонент обязательно преобразовывать цветное изображение в градации серого? Как в этом ПРИМЕРЕ . И если обязательно, то как это сделать? Наверняка есть какая то встроенная функция, но поискав я нашел только работу с каналами RGB. Пробовал копировать 3-х канальное изображение в созданное вот таким методом cvCreateImage( STD_SIZE, IPL_DEPTH_8U, 1 ), сразу вылезает ошибка. Я так понял что нельзя запихнуть автоматом цветное изображение в черно-белое. Как быть?


  12. Есть вопрос, подскажите пожалуйста! Я нахожу в кадре лицо каскадами Хаара. Затем выделяю найденную область(как в примере прямоугольником). Как мне найденную область фотографии сохранить в JPG и сделать строго определенного размера? Например 100х100 пикселей. Спасибо.


  13. Я так понял пример программы, который вы прикрепили в начале топика, это на C Builder? Ниразу просто с ним не работал и не встречался) Не имеется подобного проекта для Visual studio с++/cli? А по поводу статьи на хабре, очень доступно, врочем как и всегда, спасибо)


  14. Да, все это здорово, но все это чистая математическая теория, без практической реализации на какой-либо платформе. Вы пробовали использовать программу выложенную в начале темы, со своими наборами фотографий? Или только стандартные?


  15. Всем привет! Очень сложная тема и с ходу почему то не дается. Пытаюсь применить для MS Visual studio 2010 c++/cli. Может у кого-нибудь завалялись руководства или ссылки на них, был бы очень признателен) Что то вроде такого, пусть даже на английском Детектирование Лиц Каскадами Хаара


  16. Решил проблемму с закрытием процесса, но по-моему как то по извращенски :unsure: просто переопределив переменную в обработчике закрытия формы. Потому что static у CvCapture *capture, ничего не изменил и не устранил ошибку с cvReleaseCapture:

    
    
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    
    
    				 CvCapture *capture;
    
    
    				 // Переопределяем capture и удаляем этот объект
    
    			         timer1->Stop();
    
    
    				 capture = cvCreateCameraCapture(CV_CAP_ANY);
    
    				 cvReleaseCapture(&capture);
    
    				 this->Close();
    
    		 }
    
    
    
    

×