Skip to content

Commit 0b9883b

Browse files
committed
Fixed bug with objects lifetime
1 parent 221bbea commit 0b9883b

3 files changed

Lines changed: 44 additions & 43 deletions

File tree

async_detector/AsyncDetector.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -61,31 +61,31 @@ void AsyncDetector::Process()
6161

6262
int framesCounter = m_startFrame + 1;
6363

64-
FrameInfo frames[2];
64+
frame_ptr frames[2];
6565
size_t frameInd = 0;
6666
for (;;)
6767
{
6868
// Show frame after detecting and tracking
6969
frames[frameInd] = m_framesQue.GetFirstProcessedFrame();
70-
FrameInfo& processedFrame = frames[frameInd];
70+
frame_ptr processedFrame = frames[frameInd];
7171

7272
int64 t2 = cv::getTickCount();
7373

74-
allTime += t2 - processedFrame.m_dt;
75-
int currTime = cvRound(1000 * (t2 - processedFrame.m_dt) / freq);
74+
allTime += t2 - processedFrame->m_dt;
75+
int currTime = cvRound(1000 * (t2 - processedFrame->m_dt) / freq);
7676

77-
DrawData(&processedFrame, framesCounter, currTime);
77+
DrawData(processedFrame, framesCounter, currTime);
7878

7979
if (!writer.isOpened())
8080
{
81-
writer.open(m_outFile, cv::VideoWriter::fourcc('H', 'F', 'Y', 'U'), m_fps, processedFrame.m_frame.size(), true);
81+
writer.open(m_outFile, cv::VideoWriter::fourcc('H', 'F', 'Y', 'U'), m_fps, processedFrame->m_frame.size(), true);
8282
}
8383
if (writer.isOpened())
8484
{
85-
writer << processedFrame.m_frame;
85+
writer << processedFrame->m_frame;
8686
}
8787

88-
cv::imshow("Video", processedFrame.m_frame);
88+
cv::imshow("Video", processedFrame->m_frame);
8989

9090
int waitTime = std::max<int>(1, cvRound(1000 / m_fps - currTime));
9191
k = cv::waitKey(waitTime);
@@ -185,7 +185,7 @@ void AsyncDetector::DrawTrack(cv::Mat frame,
185185
/// \brief AsyncDetector::DrawData
186186
/// \param frameinfo
187187
///
188-
void AsyncDetector::DrawData(FrameInfo* frameInfo, int framesCounter, int currTime)
188+
void AsyncDetector::DrawData(frame_ptr frameInfo, int framesCounter, int currTime)
189189
{
190190
if (m_showLogs)
191191
{
@@ -315,20 +315,20 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f
315315
// Capture frame
316316
for (; !(*stopFlag);)
317317
{
318-
FrameInfo frameInfo;
319-
frameInfo.m_dt = cv::getTickCount();;
320-
capture >> frameInfo.m_frame;
321-
if (frameInfo.m_frame.empty())
318+
frame_ptr frameInfo(new FrameInfo());
319+
frameInfo->m_dt = cv::getTickCount();;
320+
capture >> frameInfo->m_frame;
321+
if (frameInfo->m_frame.empty())
322322
{
323323
std::cerr << "Frame is empty!" << std::endl;
324324
*stopFlag = true;
325325
break;
326326
}
327-
if (frameInfo.m_clFrame.empty())
327+
if (frameInfo->m_clFrame.empty())
328328
{
329-
frameInfo.m_clFrame = frameInfo.m_frame.getUMat(cv::ACCESS_READ);
329+
frameInfo->m_clFrame = frameInfo->m_frame.getUMat(cv::ACCESS_READ);
330330
}
331-
cv::cvtColor(frameInfo.m_frame, frameInfo.m_gray, cv::COLOR_BGR2GRAY);
331+
cv::cvtColor(frameInfo->m_frame, frameInfo->m_gray, cv::COLOR_BGR2GRAY);
332332

333333
framesQue->AddNewFrame(frameInfo);
334334

@@ -356,16 +356,16 @@ void AsyncDetector::DetectThread(const config_t& config, cv::UMat firstGray, Fra
356356

357357
for (; !(*stopFlag);)
358358
{
359-
FrameInfo& frameInfo = framesQue->GetLastUndetectedFrame();
359+
frame_ptr frameInfo = framesQue->GetLastUndetectedFrame();
360360

361-
detector->Detect(frameInfo.m_clFrame);
362-
//std::this_thread::sleep_for(std::chrono::milliseconds(100));
361+
detector->Detect(frameInfo->m_clFrame);
362+
//std::this_thread::sleep_for(std::chrono::milliseconds(500));
363363

364364
const regions_t& regions = detector->GetDetects();
365-
frameInfo.m_regions.assign(regions.begin(), regions.end());
365+
frameInfo->m_regions.assign(regions.begin(), regions.end());
366366

367-
frameInfo.m_inDetector = 2;
368-
framesQue->Signal(frameInfo.m_dt);
367+
frameInfo->m_inDetector = 2;
368+
framesQue->Signal(frameInfo->m_dt);
369369
}
370370
}
371371

@@ -379,18 +379,18 @@ void AsyncDetector::TrackingThread(const TrackerSettings& settings, FramesQueue*
379379

380380
for (; !(*stopFlag);)
381381
{
382-
FrameInfo& frameInfo = framesQue->GetFirstDetectedFrame();
382+
frame_ptr frameInfo = framesQue->GetFirstDetectedFrame();
383383
if (tracker->GrayFrameToTrack())
384384
{
385-
tracker->Update(frameInfo.m_regions, frameInfo.m_gray, frameInfo.m_fps);
385+
tracker->Update(frameInfo->m_regions, frameInfo->m_gray, frameInfo->m_fps);
386386
}
387387
else
388388
{
389-
tracker->Update(frameInfo.m_regions, frameInfo.m_clFrame, frameInfo.m_fps);
389+
tracker->Update(frameInfo->m_regions, frameInfo->m_clFrame, frameInfo->m_fps);
390390
}
391391

392-
frameInfo.m_tracks = tracker->GetTracks();
393-
frameInfo.m_inTracker = 2;
394-
framesQue->Signal(frameInfo.m_dt);
392+
frameInfo->m_tracks = tracker->GetTracks();
393+
frameInfo->m_inTracker = 2;
394+
framesQue->Signal(frameInfo->m_dt);
395395
}
396396
}

async_detector/AsyncDetector.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class AsyncDetector
5858

5959
FramesQueue m_framesQue;
6060

61-
void DrawData(FrameInfo* frameInfo, int framesCounter, int currTime);
61+
void DrawData(frame_ptr frameInfo, int framesCounter, int currTime);
6262

6363
void DrawTrack(cv::Mat frame, int resizeCoeff, const TrackingObject& track, bool drawTrajectory = true);
6464

async_detector/Queue.h

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,18 @@ class SafeQueue
119119

120120

121121
struct FrameInfo;
122+
typedef std::shared_ptr<FrameInfo> frame_ptr;
122123
///
123124
/// A threadsafe-queue with Frames
124125
///
125-
class FramesQueue : public SafeQueue<FrameInfo>
126+
class FramesQueue : public SafeQueue<frame_ptr>
126127
{
127128
public:
128129
///
129130
/// \brief AddNewFrame
130131
/// \param frameInfo
131132
///
132-
void AddNewFrame(FrameInfo& frameInfo)
133+
void AddNewFrame(frame_ptr frameInfo)
133134
{
134135
//QUE_LOG << "AddNewFrame start: " << frameInfo.m_dt << std::endl;
135136
enqueue(frameInfo);
@@ -143,7 +144,7 @@ class FramesQueue : public SafeQueue<FrameInfo>
143144
{
144145
QUE_LOG << "m_que (" << m_que.size() << "): ";
145146
size_t i = 0;
146-
for (queue_t::iterator it = m_que.begin(); it != m_que.end(); ++it)
147+
for (auto it : m_que)
147148
{
148149
if (it->m_inDetector && it->m_inTracker)
149150
{
@@ -170,18 +171,18 @@ class FramesQueue : public SafeQueue<FrameInfo>
170171
/// \brief GetLastUndetectedFrame
171172
/// \return
172173
///
173-
FrameInfo& GetLastUndetectedFrame()
174+
frame_ptr GetLastUndetectedFrame()
174175
{
175176
//QUE_LOG << "GetLastUndetectedFrame start" << std::endl;
176177

177178
std::unique_lock<std::mutex> lock(m_mutex);
178-
while (m_que.empty() || m_que.back().m_inDetector)
179+
while (m_que.empty() || m_que.back()->m_inDetector)
179180
{
180181
m_cond.wait(lock);
181182
//PrintQue();
182183
}
183-
FrameInfo& frameInfo = m_que.back();
184-
frameInfo.m_inDetector = 1;
184+
frame_ptr frameInfo = m_que.back();
185+
frameInfo->m_inDetector = 1;
185186

186187
//QUE_LOG << "GetLastUndetectedFrame end: " << frameInfo.m_dt << std::endl;
187188

@@ -197,7 +198,7 @@ class FramesQueue : public SafeQueue<FrameInfo>
197198
queue_t::iterator res_it = m_que.end();
198199
for (queue_t::iterator it = m_que.begin(); it != m_que.end(); ++it)
199200
{
200-
if (it->m_inDetector != 1 && it->m_inTracker == 0)
201+
if ((*it)->m_inDetector != 1 && (*it)->m_inTracker == 0)
201202
{
202203
res_it = it;
203204
break;
@@ -210,7 +211,7 @@ class FramesQueue : public SafeQueue<FrameInfo>
210211
/// \brief GetFirstDetectedFrame
211212
/// \return
212213
///
213-
FrameInfo& GetFirstDetectedFrame()
214+
frame_ptr GetFirstDetectedFrame()
214215
{
215216
//QUE_LOG << "GetFirstDetectedFrame start" << std::endl;
216217

@@ -222,8 +223,8 @@ class FramesQueue : public SafeQueue<FrameInfo>
222223
it = SearchUntracked();
223224
//PrintQue();
224225
}
225-
FrameInfo& frameInfo = *it;
226-
frameInfo.m_inTracker = 1;
226+
frame_ptr frameInfo = *it;
227+
frameInfo->m_inTracker = 1;
227228

228229
//QUE_LOG << "GetFirstDetectedFrame end: " << frameInfo.m_dt << std::endl;
229230
return frameInfo;
@@ -233,17 +234,17 @@ class FramesQueue : public SafeQueue<FrameInfo>
233234
/// \brief GetFirstProcessedFrame
234235
/// \return
235236
///
236-
FrameInfo GetFirstProcessedFrame()
237+
frame_ptr GetFirstProcessedFrame()
237238
{
238239
//QUE_LOG << "GetFirstProcessedFrame start" << std::endl;
239240

240241
std::unique_lock<std::mutex> lock(m_mutex);
241-
while (m_que.empty() || m_que.front().m_inTracker != 2)
242+
while (m_que.empty() || m_que.front()->m_inTracker != 2)
242243
{
243244
m_cond.wait(lock);
244245
//PrintQue();
245246
}
246-
FrameInfo frameInfo = m_que.front();
247+
frame_ptr frameInfo = m_que.front();
247248
m_que.pop_front();
248249

249250
//QUE_LOG << "GetFirstProcessedFrame end: " << frameInfo.m_dt << std::endl;

0 commit comments

Comments
 (0)