Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Дмитрий84
1 / 1 / 0
Регистрация: 30.04.2014
Сообщений: 19
#1

Не получается сохранить найденные координаты центров для дальнейшего оперирования ими - C++

06.05.2014, 04:16. Просмотров 283. Ответов 8
Метки нет (Все метки)

Есть цикл который находит центр объекта и ведет обведение его прямоугольником и отмечает этот центр.

C++
1
2
3
4
5
6
 for(int i = 0; i < faces.size(); i++ )
        {
            Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
                    face_i = faces[i];
                    rectangle(frame, face_i, CV_RGB(0, 255,0), 3);
            ellipse( frame, center, Size( faces[i].width/faces[i].width, faces[i].height/faces[i].height), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );}
Всё дело в том что цикл запускается только когда в кадре есть искомый объект, и ни как не получается сохранить найденные координаты центров для дальнейшего оперирования ими, если я создаю массив то при отсутствии в кадре объекта он обнуляет все элементы,
а если делаю вот так
C++
1
2
3
4
5
nt x0;int y0;int x1;    
        x1=x0;
 
        y0= center.y ;
        x0 = y0;
то работает правильно только при наличии 2х объектов в кадре если один то х1 всегда 0. подскажите как можно реализовать. Мне подсказывали Найти смещение точки координаты которой находятся в цикле оперировать faces[i], но тоже ни чего не получилось.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 04:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается сохранить найденные координаты центров для дальнейшего оперирования ими (C++):

Сохранить отрисованный объект в ОЗУ для дальнейшего использования - C++
Рисую в окне график. Есть функция которая вычисляет и выводит его размер и расположение линий. Нужно чтобы эта сетка графика сохранялась в...

Даны координаты центров n окружностей и их радиусы. Определить число пересекающихся окружностей - C++
Допуск к экзамену в субботу а не решено еще 5 заданий по С++ 1.Даны координаты центров n окружностей и их радиусы. Определить число...

Задать произвольные координаты центров x(i), y(i) и радиусов r(i) для n окружностей - Visual Basic
Имеются две точки с координатами (a,b) и (c,d). Задать произвольные координаты центров x(i),y(i) и радиусов r(i) для n окружностей. ...

Как сохранить игру для дальнейшего продолжения ? - C++ Builder
Помогите пожалуйста !! Ести игра &quot;Сапер&quot;. Нужно сделать так, чтобы была возможность сохранить игру, а потом ее продолжать. ...

Java + Apache Derby (сохранить данные пользователя в базе данных для дальнейшего использования) - Java БД
Добрый день! Пишу приложения, необходимо сохранить данные пользователя в базе данных и потом извлечь их оттуда для дальнейшего...

Координаты центров объектов - C++ Linux
Есть текстовый файл данных с макетного рентгено-графического сепаратора размерностью (512+1)*30 000 строк, он достаточно большой, поэтому...

8
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 244
06.05.2014, 05:38 #2
nt x0;int y0;int x1; а записать
int x0, y0, x1; не лучше ли?
Код вставляй в тегах [ CPP]тут код[ /CPP] - только пробелы убери перед cpp
скинь исходник, а лучше проект в архиве.
1
Дмитрий84
1 / 1 / 0
Регистрация: 30.04.2014
Сообщений: 19
06.05.2014, 05:50  [ТС] #3
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include "stdafx.h"
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/contrib/detection_based_tracker.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <fstream>
#include <ctime>
#include <time.h>
#include "opencv2/video/tracking.hpp"
 
 
using namespace cv;
using namespace std;
 
#define MAX(a,B) ((a<B) ? b : a);
#define MIN(a,B) ((a<B) ? a : B);
 
 
String cascade_name = "D:/qwerty/wer/haarcascade/cascade.xml";
String window_name = "tracing face";
CascadeClassifier cascade;
int a=0;
Point pt1 = (20,360);
Point pt2 = (700,360);
 
 
 
 
 
 
void detectAndDisplay( Mat frame )
{
  vector<Rect> faces;
  Mat frame_gray;
  cv::Rect_<int> face_i;
 
  cvtColor( frame, frame_gray, CV_BGR2GRAY );
  equalizeHist( frame_gray, frame_gray );
 
  //-- Detect faces
 
  time_t t;
    tm *tk;
    
    time(&t);
    tk=localtime(&t);
 
    
  cascade.detectMultiScale( frame_gray, faces, 1.1, 9, 2|8, Size(70, 70) );
  //string str = String.Format("{0}:{1:D2}:{2:D2}", tk->tm_hour,tk->tm_min, tk->tm_sec);
 
 //cout << tk->tm_hour << tk->tm_min << tk->tm_sec << endl;
 
 
    //Create a font object.
    CvFont font;
 
    string box_text1 = format(" %d ",a);
    //Write the number of people counted at the top of the output frame.
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
    putText(frame, box_text1, cvPoint(60, 200), FONT_HERSHEY_SIMPLEX, 1.0, CV_RGB(0,255,0),2.0);
    
    string box_text2 = format("  %d:%d:%d ", tk->tm_hour , tk->tm_min , tk->tm_sec);
    //Write the number of people counted at the top of the output frame.
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
    putText(frame, box_text2, cvPoint(20, 30), FONT_HERSHEY_SIMPLEX, 1.0, CV_RGB(0,255,0),2.0);
 
    line(frame, cvPoint (0,360), cvPoint(1320,360),CV_RGB(250,0,0),1,8,0);
  
   
     
 
  for(int i = 0; i < faces.size(); i++ )
        {
            Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
                    face_i = faces[i];
                        
                    
                    // Make a rectangle around the detected object
                        rectangle(frame, face_i, CV_RGB(0, 255,0), 3);
        int x0;int y0;int x1;   
        x1=x0;
 
        y0= center.y ;
        x0 = y0;
        /*for(int n=1;n<j;++n)
        {koordy[n]=center.y; n++;
 
    x1=abs(koordy[n]-koordy[n-1]);
if (x1<=350 && x1>1200) a=a; else a++;*/
                    
        
             
                        ellipse( frame, center, Size( faces[i].width/faces[i].width, faces[i].height/faces[i].height), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );
           printf ("vremy poiska= %d:%d:%d\n", tk->tm_hour , tk->tm_min , tk->tm_sec);
                 
        double t = (double)getTickCount();  
            
 
 
 printf_s ("razmer=%d \n",x1);
printf_s ("razmer1=%d \n",y0);
        string box_text = format("PC 400 : %d\n",a);
            // And now put it into the image:
           printf ("q= %d,%d \n",center);
            putText(frame, box_text,center, FONT_HERSHEY_SIMPLEX, 1.0, CV_RGB(0,255,0), 2.0);
            
 
            printf ("a=%d \n",a);
          }
 
 
  //-- Show what you got
  imshow( window_name, frame);
 }
 
 
 
 
CvCapture *capture;
 
int main(int argc, char **argv)
{    // имя файла задается 1 параметром или “test.avi” по умолчанию
    const char *filename = argc == 2 ? argv[1]:"http://root:root@192.168.28.80/mjpg/1/video.mjpg";
    
    // создание окна
    //cvNamedWindow("Video Tracking", CV_WINDOW_AUTOSIZE);
    
    
    capture = cvCreateFileCapture(filename);
    
    
 
    cascade.load(cascade_name);
 
     
 
    while(1)
    {
        // получаем следующий кадр
        IplImage *frame = cvQueryFrame(capture);
        
            if (!frame)
            break;
 // показываем
         detectAndDisplay( frame );
 
  
       // показываем кадр
      // cvShowImage("Video Tracking",frame);
      char c = cvWaitKey(33); // выход при нажатии ESC
       if (c == 27)
           break;std::swap(prevgray, gray);
    }
    
    // освобождаем ресурсы
    cvReleaseCapture(&capture);
    cvDestroyWindow("Video Tracking");
    return 0;
}

Я знаю что очень много лишнего здесь но пока всё это в режиме отладки-подгонки-выбора методов, поэтому многое не удаляю а закоментирую.

Добавлено через 5 минут
Суть такая прога с IP-камеры берет поток и ищет объекты по заранее обученному каскаду. надо прикрутить счетчик прохода через линию. Пока прога может посчитать объекты в кадре но при 8к\сек она их считает очень много раз. хочу понять как мне сравнить центр текущий с предыдущим и ни чего не выходит.
0
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 244
06.05.2014, 06:08 #4
C++
1
2
3
4
int x0;int y0;int x1;
x1=x0;
y0= center.y ;
x0 = y0;
при первом проходе цикла вы объявляете x0, x1, которые равны 0, потом приравниваете их.
y0=center.y;
x0=y0;

т.е. x1 так и осталось 0. Изменилось x0, и x1 станет рано x0, уже при втором проходе цикла.
Так у вас и должно быть?
1
Дмитрий84
1 / 1 / 0
Регистрация: 30.04.2014
Сообщений: 19
06.05.2014, 06:14  [ТС] #5
Да, но загвоздка в том что цикл не постоянный а только если объект есть в кадре соответственно х1 у меня почти всегда равно 0 и срабатывает как я хочу только в случае если в кадре 2 объекта. Сейчас при компиляции приведенного выше кода х1 принимает значение 32503200 и не меняет его, я даже не представляю откуда это число.

Добавлено через 1 минуту
Было мнение сохранять точки centr.y в массив и сравнивать элементы, но я не знаю как реализовать, там примерно такая же ситуация получается, либо зануляет числа массива либо они запредельно большие.
0
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 244
06.05.2014, 06:17 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я ошибся, они не равны 0.
int x0;int y0;int x1;
замените на
int x0=0, y0=0, x1=0; и объявите их до цикла
1
Дмитрий84
1 / 1 / 0
Регистрация: 30.04.2014
Сообщений: 19
06.05.2014, 06:30  [ТС] #7
Я так уже делал, но попробовал еще раз. теперь х1=0 и опять работает как хотелось бы только если в кадре два объекта. а если один то х1=0 и непринемает значение предыдущего прохода цикла
0
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 244
06.05.2014, 06:43 #8
сейчас выглядит так?
C++
1
2
3
int x0=0, y0=0, x1=0;
for(int i = 0; i < faces.size(); i++ )
{}
Предыдущего прохода? Если один объект в кадре, то проход будет один же...
также поставьте вывод на экран значений переменных
i, faces.size(), x1, x0, y0? что бы могли видеть, как изменяются они в цикле.
1
Дмитрий84
1 / 1 / 0
Регистрация: 30.04.2014
Сообщений: 19
06.05.2014, 07:11  [ТС] #9
да сейчас выглядит так. вывод переменных такой
faces.size()=1(или количеству объектов если их больше 1)
i=faces.size()-1
х1=0 (если объектов два то принимает вторую координату)
х0=равна координате
у0=равна координате
А хочется чтоб в х1 ложилось значение прошлой координаты чтоб можно было получить смещение точки.

Добавлено через 21 минуту
detectMultiScale - Обнаруженные объекты возвращаются в виде списка прямоугольников.
может как-то отсюда их можно выудить чтоб не делать это в цикле?
0
06.05.2014, 07:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 07:11
Привет! Вот еще темы с ответами:

Произвольно задать координаты центров непересекающихся окружностей - Maple
Нужно задать произвольно центры окружностей, при этом все окружности одного радиуса и не должны пересекаться между собой. В Паскале...

Как сохранить найденные разделители через re.split()? - Python
Здравствуйте! Подскажите, пожалуйста. Нужно разбить строку по определенной комбинации символов, заданной регулярным выражением, но...

Две окружности заданы координатами центров и радиусами. Составьте программу, которая находит координаты точек - Delphi
Две окружности заданы координатами центров и радиусами. Составьте программу, которая находит координаты точек пересечения данных...

Быстрый способ оперирования данными - Delphi
Приветствую. Подскажите, посредством чего в Дельфи 2010 можно без задержек оперировать данными? т.е. прога открывает файл, парсит его,...


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

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

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