forked from augcog/OpenARK
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConverter.cpp
More file actions
76 lines (71 loc) · 3.12 KB
/
Converter.cpp
File metadata and controls
76 lines (71 loc) · 3.12 KB
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
#include "stdafx.h"
#include "Version.h"
#include "Converter.h"
namespace ark {
/***
Returns the next frame if next frame is recorded
Returns the previous frame if next frame is not recorded
***/
void Converter::ConvertPXCImageToOpenCVMat(Intel::RealSense::Image *inImg, Intel::RealSense::ImageData data, cv::Mat *outImg) {
int cvDataType = 0;
int cvDataWidth = 0;
auto imgInfo = inImg->QueryInfo();
switch (data.format)
{
/* STREAM_TYPE_COLOR */
case Intel::RealSense::Image::PIXEL_FORMAT_YUY2: /* YUY2 image */
{
// special handling for YUY2
cv::Mat picYV12 = cv::Mat(imgInfo.height, imgInfo.width, CV_8UC2, data.planes[0], 0);
cv::cvtColor(picYV12, *outImg, CV_YUV2BGR_YUY2);
}
return;
case Intel::RealSense::Image::PIXEL_FORMAT_NV12: /* NV12 image */
{
// special handling for NV12
cv::Mat picYV12 = cv::Mat(imgInfo.height, imgInfo.width, CV_8UC3, data.planes[0], 0);
cv::cvtColor(picYV12, *outImg, CV_YUV2BGR_NV12);
}
return;
case Intel::RealSense::Image::PIXEL_FORMAT_RGB32: /* BGRA layout on a little-endian machine */
cvDataType = CV_8UC4;
cvDataWidth = 4;
break;
case Intel::RealSense::Image::PIXEL_FORMAT_RGB24: /* BGR layout on a little-endian machine */
cvDataType = CV_8UC3;
cvDataWidth = 3;
break;
case Intel::RealSense::Image::PIXEL_FORMAT_Y8: /* 8-Bit Gray Image, or IR 8-bit */
cvDataType = CV_8U;
cvDataWidth = 1;
break;
/* STREAM_TYPE_DEPTH */
case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH: /* 16-bit unsigned integer with precision mm. */
case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH_RAW: /* 16-bit unsigned integer with device specific precision (call device->QueryDepthUnit()) */
cvDataType = CV_16U;
cvDataWidth = 2;
break;
case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH_F32: /* 32-bit float-point with precision mm. */
cvDataType = CV_32F;
cvDataWidth = 4;
break;
/* STREAM_TYPE_IR */
case Intel::RealSense::Image::PIXEL_FORMAT_Y16: /* 16-Bit Gray Image */
cvDataType = CV_16U;
cvDataWidth = 2;
break;
case Intel::RealSense::Image::PIXEL_FORMAT_Y8_IR_RELATIVE: /* Relative IR Image */
cvDataType = CV_8U;
cvDataWidth = 1;
break;
default:
break;
}
// assume no other planes exist
if (data.planes[1] != nullptr) throw; // not implemented
// assume that no sub pixel padding needed
if (data.pitches[0] % cvDataWidth != 0) throw; // not implemented
outImg->create(imgInfo.height, data.pitches[0] / cvDataWidth, cvDataType);
memcpy(outImg->data, data.planes[0], imgInfo.height * imgInfo.width * cvDataWidth);
}
}