Форум программистов, компьютерный форум, киберфорум
phpBB
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 22.10.2011
Сообщений: 18
1

Motion Detector (OpenCV)

22.10.2011, 15:33. Просмотров 2042. Ответов 1
Метки нет (Все метки)


Всем привет! =)
Только начал разбираться с OpenCV. Хочу попробовать камеру распознавать движение. Детектор движения должен реализоваться на C++ при помощи библиотеки OpenCV.
Но возникла одна проблемка. Вот, собственно код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "v_motion_detector.h"
 
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/video/tracking.hpp>
 
const double VMotionDetector::MOTION_THRESHOLD = 10;
const double VMotionDetector::MIN_CONTOUR_AREA = 150;
 
VMotionDetector::VMotionDetector( const cv::Size& imageSize, double cycleTime) :
        m_previousImage( cv::Mat::zeros( imageSize, CV_8UC1 ) ),
        m_motionHistoryImage( imageSize, CV_32FC1 ),
        m_openingKernel( 5, 5, CV_8UC1 ),
        m_segmask( imageSize, CV_32FC1 ),
        m_maxMotionGradient( 1.5 * cycleTime ),
        m_motionHistoryDuration( 7 * cycleTime )
{
}
 
void VMotionDetector::detectMovingRegions( const cv::Mat& currentFrame, double timestamp,
                                           std::vector<cv::Rect>& targets , cv::Mat& mask )
{
 //Сглаживаем текущий кадр (currentFrame) фильтром Гаусса, чтобы избавиться от шумов.
 
    cv::GaussianBlur( currentFrame, m_bluredImage, cv::Size( 3, 3 ), -1 );
 
//Из сглаженного текущего кадра (m_bluredImage ) вычитаем предыдущий (m_previousImage).
//Если искомые изображения были в градациях серого, то и значения пикселей
//в разности (mask) будут изменяться от нуля до 255(при восьми битной глубине цвета).
 
    cv::absdiff( m_bluredImage, m_previousImage, mask );
 
//Сравниваем значения полученной разности с некоторым пороговым
//значением (MOTION_THRESHOLD). Если значение пикселя больше порогового,
//то этот пиксель принадлежит движущемуся объекту, иначе отбрасываем его.
//Теперь мы получили бинарное изображение (mask), где ноль означает, что 
//пиксель не движется, отличное от нуля значение – пиксель движется.
 
    cv::threshold( mask, mask,  MOTION_THRESHOLD, 255, cv::THRESH_BINARY );
 
//Применяем морфологические операции закрытия и открытия,
//чтобы избавиться от движущихся регионов малого размера (шумы камеры).
//Полученное изображение (mask) и есть движущийся контур.
 
    cv::morphologyEx( mask, mask, cv::MORPH_CLOSE, cv::Mat() );
    cv::morphologyEx( mask, mask, cv::MORPH_OPEN, m_openingKernel,
                      cv::Point( -1, -1 ), 1, cv::BORDER_CONSTANT, cv::Scalar( 0 ) );
 
//Наносим бинарное изображение на так называемое изображение истории движения
//(motionHistoryImage). На нём нарисованы движущиеся контуры за последние, например,
//200 мс (m_motionHistoryDuration). Контуры были получены через постоянные промежутки
//времени. Интенсивность пикселей контура обратно пропорциональна времени, которое
//прошло от измерения контура до данного момента. Т.е. чем раньше был получен
//движущийся контур, тем он бледнее изображён на изображение истории движения.
    
    cv::updateMotionHistory( mask, m_motionHistoryImage, timestamp, m_motionHistoryDuration );
 
//Выделяем регионы (targets) с различными движениями на изображение истории движения.  
 
    cv::segmentMotion(m_motionHistoryImage, m_segmask, targets, timestamp, m_maxMotionGradient);
    
//Отбрасываем все регионы, площадь которых меньше некоторого значения (MIN_CONTOUR_AREA).
 
    std::vector<cv::Rect>::const_iterator it = targets.begin();
    
    for(it = targets.begin(); it != targets.end(); ++it) {
        if(cv::countNonZero(mask(*it)) < MIN_CONTOUR_AREA) 
            targets.erase(it);
    }
//Сохраняем сглаженный текущий кадр как предыдущий кадр.
    m_bluredImage.copyTo( m_previousImage );
}
На этапе выполнения возникает ошибка:
"Expression: vector iterator not dereferencable."
Облазил весь интеренет, ничего не нашёл. Одна надежда на вас)) Помогите, пожалуйста!!!!!

Добавлено через 32 минуты
Упс)) немного не по теме я попал)) *facepalm*
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2011, 15:33
Ответы с готовыми решениями:

Motion Detector (OpenCV)
Всем привет! =) Только начал разбираться с OpenCV. Хочу попробовать камеру распознавать движение....

SURF DETECTOR на EmguCV
При компиляции проекта выдает ошибку в строке: Dim surfDetector As SURFDetector = New...

Spyware process detector(dllhost)
Всем доброго времени суток! Проблема такая, скачал программку Spyware Process Detector v3.22(может...

Vusial Leak Detector ничего не выводит
Естественно подключил все заголовочные файлы и статические библиотеки. Рядом почти такой-же проект...

1
Amator
22.10.2011, 16:15     Motion Detector (OpenCV)
  #2

Не по теме:

*Здесь был оффтоп*

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2011, 16:15
Привет! Вот еще темы с ответами:

Raspberry и Motion
Решил сделать нечто вроде IP видеокамеры на Raspberry, которая будет транслировать видео в браузер,...

SURF DETECTOR на EmguCV - ошибка компиляции проекта
При компиляции проекта выдает ошибку в строке: Dim surfDetector As SURFDetector = New...

slow motion bug
система: AMD Phenom II X4 925 Processor, 8.0GB RAM, NVIDIA GeForce GTS 450 MS Windows 7 Ultimate...

Motion + mencoder + wput = ?
Всем доброе время суток. В общем сразу по делу. Поставился задачей, цель которой - это ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.