19 #include "visiontransfer/imageset.h" 24 #include <arpa/inet.h> 32 : width(0), height(0), qMatrix(NULL), timeSec(0), timeMicrosec(0),
33 seqNum(0), minDisparity(0), maxDisparity(0), subpixelFactor(16),
34 referenceCounter(NULL), numberOfImages(2), indexLeftImage(0), indexRightImage(1), indexDisparityImage(-1) {
35 for (
int i=0; i<MAX_SUPPORTED_IMAGES; ++i) {
43 copyData(*
this, other,
true);
49 copyData(*
this, other,
true);
54 ImageSet::~ImageSet() {
58 void ImageSet::copyData(
ImageSet& dest,
const ImageSet& src,
bool countRef) {
59 dest.width = src.width;
60 dest.height = src.height;
62 dest.numberOfImages = src.numberOfImages;
63 for(
int i=0; i<src.numberOfImages; i++) {
64 dest.rowStride[i] = src.rowStride[i];
65 dest.formats[i] = src.formats[i];
66 dest.data[i] = src.data[i];
69 dest.qMatrix = src.qMatrix;
70 dest.timeSec = src.timeSec;
71 dest.timeMicrosec = src.timeMicrosec;
72 dest.seqNum = src.seqNum;
73 dest.minDisparity = src.minDisparity;
74 dest.maxDisparity = src.maxDisparity;
75 dest.subpixelFactor = src.subpixelFactor;
76 dest.referenceCounter = src.referenceCounter;
77 dest.numberOfImages = src.numberOfImages;
78 dest.indexLeftImage = src.indexLeftImage;
79 dest.indexRightImage = src.indexRightImage;
80 dest.indexDisparityImage = src.indexDisparityImage;
82 if(dest.referenceCounter !=
nullptr && countRef) {
83 (*dest.referenceCounter)++;
87 void ImageSet::decrementReference() {
88 if(referenceCounter !=
nullptr && --(*referenceCounter) == 0) {
94 delete referenceCounter;
97 referenceCounter =
nullptr;
103 throw std::runtime_error(
"Illegal image number!");
106 std::fstream strm(fileName, std::ios::out | std::ios::binary);
109 int type, maxVal, bytesPerChannel, channels;
110 switch(formats[imageNumber]) {
130 throw std::runtime_error(
"Illegal pixel format!");
133 strm <<
"P" << type <<
" " << width <<
" " << height <<
" " << maxVal << std::endl;
136 for(
int y = 0; y < height; y++) {
137 for(
int x = 0; x < width*channels; x++) {
138 unsigned char* pixel = &data[imageNumber][y*rowStride[imageNumber] + x*bytesPerChannel];
139 if(bytesPerChannel == 2) {
141 unsigned short swapped = htons(*reinterpret_cast<unsigned short*>(pixel));
142 strm.write(reinterpret_cast<char*>(&swapped),
sizeof(swapped));
144 strm.write(reinterpret_cast<char*>(pixel), 1);
155 default:
throw std::runtime_error(
"Invalid image format!");
160 dest.decrementReference();
161 copyData(dest, *
this,
false);
163 dest.qMatrix =
new float[16];
164 memcpy(const_cast<float*>(dest.qMatrix), qMatrix,
sizeof(
float)*16);
169 dest.rowStride[i] = width*bytesPixel;
170 dest.data[i] =
new unsigned char[height*dest.rowStride[i]];
173 for(
int y = 0; y < height; y++) {
174 memcpy(&dest.data[i][y*dest.rowStride[i]], &data[i][y*rowStride[i]],
179 dest.referenceCounter =
new int;
180 (*dest.referenceCounter) = 1;
188 default:
throw std::runtime_error(
"Invalid image format!");
194 if (imageNumber ==
getIndexOf(ImageSet::ImageType::IMAGE_LEFT))
return ImageSet::ImageType::IMAGE_LEFT;
195 if (imageNumber ==
getIndexOf(ImageSet::ImageType::IMAGE_RIGHT))
return ImageSet::ImageType::IMAGE_RIGHT;
196 if (imageNumber ==
getIndexOf(ImageSet::ImageType::IMAGE_DISPARITY))
return ImageSet::ImageType::IMAGE_DISPARITY;
197 throw std::runtime_error(
"Invalid image number for getImageType!");
200 void ImageSet::setImageDisparityPair(
bool dispPair) {
201 if (
getNumberOfImages() != 2)
throw std::runtime_error(
"setImageDisparityPair is only supported for two-image sets");
204 indexRightImage = dispPair ? -1 : 1;
205 indexDisparityImage = dispPair ? 1 : -1;
212 idx = indexLeftImage;
216 idx = indexRightImage;
219 case IMAGE_DISPARITY: {
220 idx = indexDisparityImage;
224 throw std::runtime_error(
"Invalid ImageType for query!");
226 if (throwIfNotFound && (idx==-1))
throw std::runtime_error(
"ImageSet does not contain the queried ImageType");
233 indexLeftImage = idx;
237 indexRightImage = idx;
240 case IMAGE_DISPARITY: {
241 indexDisparityImage = idx;
245 std::cout <<
"what=" << what << std::endl;
246 throw std::runtime_error(
"Invalid ImageType for setIndexOf!");
int getBitsPerPixel(int imageNumber) const
Returns the number of bits that are required to store one image pixel.
void writePgmFile(int imageNumber, const char *fileName) const
Writes one image of the set to a PGM or PPM file.
int getIndexOf(ImageType what, bool throwIfNotFound=false) const
Returns the index of a specific image type.
int getNumberOfImages() const
Returns the number of images in this set.
int getBytesPerPixel(int imageNumber) const
Returns the number of bytes that are required to store one image pixel.
ImageSet()
Default constructor creating an image set with no pixel data.
void copyTo(ImageSet &dest)
Makes a deep copy of this image set.
ImageType
Supported image types.
ImageType getImageType(int imageNumber) const
Returns the ImageType of the specified channel.
ImageFormat
Image formats that can be transferred.
A set of one to three images, but usually two (the left camera image and the disparity map)...
void setIndexOf(ImageType what, int idx)
Assign an image index to a specified ImageType, -1 to disable.