ImageKeypointBuffer.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package <PACKAGE_NAME>::<CATEGORY>::ImageKeypointBuffer
17  * @author Stefan Reither ( stef dot reither at web dot de )
18  * @date 2018
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 #include "ImageKeypointBuffer.h"
24 
25 #include <Image/ImageProcessor.h>
26 
27 using namespace armarx;
28 
30 {
31  this->_imageProviderInfo = imageProviderInfo;
32 }
33 
35 {
36  _buffer.clear();
37 }
38 
39 bool
40 ImageKeypointBuffer::addRGBImage(CByteImage* rgbImage, long timestamp)
41 {
42  std::unique_lock lock(_bufferMutex);
43  ImageKeypointTriplePtr triple = ensureTriple(timestamp);
44  triple->rgbImage = new CByteImage(_imageProviderInfo.imageFormat.dimension.width,
45  _imageProviderInfo.imageFormat.dimension.height,
46  CByteImage::eRGB24);
47  ::ImageProcessor::CopyImage(rgbImage, triple->rgbImage);
48 
49  return isComplete(timestamp);
50 }
51 
52 bool
53 ImageKeypointBuffer::addDepthImage(CByteImage* depthImage, long timestamp)
54 {
55  std::unique_lock lock(_bufferMutex);
56  ImageKeypointTriplePtr triple = ensureTriple(timestamp);
57  triple->depthImage = new CByteImage(_imageProviderInfo.imageFormat.dimension.width,
58  _imageProviderInfo.imageFormat.dimension.height,
59  CByteImage::eRGB24);
60  ::ImageProcessor::CopyImage(depthImage, triple->depthImage);
61 
62  return isComplete(timestamp);
63 }
64 
65 bool
67 {
68  std::unique_lock lock(_bufferMutex);
69  ImageKeypointTriplePtr triple = ensureTriple(timestamp);
70  triple->keypoints.reset(new KeypointManager(*keypoints));
71 
72  return isComplete(timestamp);
73 }
74 
76 ImageKeypointBuffer::getTripleAtTimestamp(long timestamp, bool deleteOlderTriples)
77 {
78  std::unique_lock lock(_bufferMutex);
79  ImageKeypointTriplePtr triple = ensureTriple(timestamp);
80  if (triple->keypoints && triple->depthImage && triple->rgbImage)
81  {
82  std::map<long, ImageKeypointBuffer::ImageKeypointTriplePtr>::iterator it =
83  _buffer.erase(_buffer.find(timestamp));
84 
85  if (deleteOlderTriples)
86  {
87  deleteOlderEntries(it);
88  }
89  return triple;
90  }
91  else
92  {
93  return ImageKeypointTriplePtr();
94  }
95 }
96 
97 std::pair<long, ImageKeypointBuffer::ImageKeypointTriplePtr>
99 {
100  std::unique_lock lock(_bufferMutex);
101  if (_buffer.size() > 0)
102  {
103  auto pair = *_buffer.begin();
104  _buffer.erase(_buffer.begin());
105  return std::move(pair);
106  }
107  else
108  {
109  return std::make_pair(0, ImageKeypointTriplePtr());
110  }
111 }
112 
113 std::pair<long, ImageKeypointBuffer::ImageKeypointTriplePtr>
115 {
116  std::unique_lock lock(_bufferMutex);
117  // Iterate from the beginning over all entries until a complete one is found
118  std::map<long, ImageKeypointBuffer::ImageKeypointTriplePtr>::iterator it = _buffer.begin();
119  while (!isComplete((*it).first))
120  {
121  it++;
122  }
123  auto pair = *it;
124 
125  if (deleteOlderTriples)
126  {
127  deleteOlderEntries(it);
128  }
129  return std::move(pair);
130 }
131 
132 void
134 {
135  // remove all entires
136  _buffer.clear();
137 }
138 
140 ImageKeypointBuffer::ensureTriple(long timestamp)
141 {
142  if (_buffer.count(timestamp) == 0)
143  {
144  _buffer.insert(std::make_pair(timestamp, std::make_shared<ImageKeypointTriple>()));
145  }
146  return _buffer.at(timestamp);
147 }
148 
149 bool
150 ImageKeypointBuffer::isComplete(long timestamp)
151 {
152  ImageKeypointTriplePtr triple = ensureTriple(timestamp);
153  return (triple->keypoints && triple->depthImage && triple->rgbImage) ? true : false;
154 }
155 
156 void
157 ImageKeypointBuffer::deleteOlderEntries(
158  std::map<long, ImageKeypointBuffer::ImageKeypointTriplePtr>::iterator it)
159 {
160  if (it == _buffer.end())
161  {
162  _buffer.clear();
163  }
164  else
165  {
166  _buffer.erase(_buffer.begin(), it);
167  }
168 }
armarx::ImageKeypointBuffer::getOldestCompleteTriple
std::pair< long, ImageKeypointBuffer::ImageKeypointTriplePtr > getOldestCompleteTriple(bool deleteOlderTriples=true)
Definition: ImageKeypointBuffer.cpp:114
armarx::ImageKeypointBuffer::addDepthImage
bool addDepthImage(CByteImage *depthImage, long timestamp)
Definition: ImageKeypointBuffer.cpp:53
armarx::ImageKeypointBuffer::addKeypoints
bool addKeypoints(KeypointManagerPtr keypoints, long timestamp)
Definition: ImageKeypointBuffer.cpp:66
armarx::KeypointManagerPtr
std::shared_ptr< KeypointManager > KeypointManagerPtr
Definition: KeypointManager.h:184
armarx::KeypointManager
A brief description.
Definition: KeypointManager.h:192
armarx::ImageKeypointBuffer::getTripleAtTimestamp
ImageKeypointTriplePtr getTripleAtTimestamp(long timestamp, bool deleteOlderTriples=true)
Definition: ImageKeypointBuffer.cpp:76
armarx::ImageKeypointBuffer::ImageKeypointBuffer
ImageKeypointBuffer(const visionx::ImageProviderInfo &imageProviderInfo)
ImageKeypointBuffer Constructor.
Definition: ImageKeypointBuffer.cpp:29
visionx::ImageProviderInfo::imageFormat
ImageFormatInfo imageFormat
Image format struct that contains all necessary image information.
Definition: ImageProcessor.h:509
armarx::ImageKeypointBuffer::getOldestTriple
std::pair< long, ImageKeypointBuffer::ImageKeypointTriplePtr > getOldestTriple()
Definition: ImageKeypointBuffer.cpp:98
armarx::ImageKeypointBuffer::clear
void clear()
Definition: ImageKeypointBuffer.cpp:133
visionx::ImageProviderInfo
Definition: ImageProcessor.h:479
ImageKeypointBuffer.h
armarx::ImageKeypointBuffer::~ImageKeypointBuffer
~ImageKeypointBuffer()
ImageKeypointBuffer Destructor.
Definition: ImageKeypointBuffer.cpp:34
armarx::ImageKeypointBuffer::ImageKeypointTriplePtr
std::shared_ptr< ImageKeypointTriple > ImageKeypointTriplePtr
Definition: ImageKeypointBuffer.h:62
armarx::ImageKeypointBuffer::addRGBImage
bool addRGBImage(CByteImage *rgbImage, long timestamp)
Definition: ImageKeypointBuffer.cpp:40
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27