Skip to content

Commit 4e02f0d

Browse files
hzcyfSajjad Ali
authored andcommitted
Merge pull request opencv#22936 from hzcyf:orbbec_new_cam_support
videoio: add Orbbec Gemini 2 and Astra 2 camera support ### Test Result | OS | Compiler | Camera | Result | |-----|-----------|---------|--------| |Windows11| (VS2022)MSVC17.3|Orbbec Gemini 2|Pass| |Windows11| (VS2022)MSVC17.3|Orbbec Astra 2|Pass| |Ubuntu22.04|GCC9.2|Orbbec Gemini 2|Pass| |Ubuntu22.04|GCC9.2|Orbbec Astra 2|Pass| ### Pull Request Readiness Checklist - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] The feature is well documented and sample code can be built with the project CMake
1 parent 7becac8 commit 4e02f0d

File tree

6 files changed

+211
-28
lines changed

6 files changed

+211
-28
lines changed

modules/videoio/src/cap_obsensor/obsensor_stream_channel_interface.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232

3333
namespace cv {
3434
namespace obsensor {
35+
36+
#define OBSENSOR_CAM_VID 0x2bc5 // usb vid
37+
#define OBSENSOR_ASTRA2_PID 0x0660 // pid of Orbbec Astra 2 Camera
38+
#define OBSENSOR_GEMINI2_PID 0x0670 // pid of Orbbec Gemini 2 Camera
39+
3540
enum StreamType
3641
{
3742
OBSENSOR_STREAM_IR = 1,
@@ -45,6 +50,7 @@ enum FrameFormat
4550
FRAME_FORMAT_YUYV = 0,
4651
FRAME_FORMAT_MJPG = 5,
4752
FRAME_FORMAT_Y16 = 8,
53+
FRAME_FORMAT_Y14 = 9,
4854
};
4955

5056
enum PropertyId
@@ -93,6 +99,7 @@ class IStreamChannel
9399
virtual bool getProperty(int propId, uint8_t* recvData, uint32_t* recvDataSize) = 0;
94100

95101
virtual StreamType streamType() const = 0;
102+
virtual uint16_t getPid() const =0;
96103
};
97104

98105
// "StreamChannelGroup" mean a group of stream channels from same one physical device

modules/videoio/src/cap_obsensor/obsensor_stream_channel_msmf.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,13 +474,13 @@ STDMETHODIMP MSMFStreamChannel::OnReadSample(HRESULT hrStatus, DWORD dwStreamInd
474474
if (sample)
475475
{
476476
ComPtr<IMFMediaBuffer> buffer = nullptr;
477-
DWORD max_length, current_length;
477+
DWORD maxLength, currentLength;
478478
byte* byte_buffer = nullptr;
479479

480480
HR_FAILED_EXEC(sample->GetBufferByIndex(0, &buffer), { return S_OK; });
481481

482-
buffer->Lock(&byte_buffer, &max_length, &current_length);
483-
Frame fo = { currentProfile_.format, currentProfile_.width, currentProfile_.height, current_length, (uint8_t*)byte_buffer };
482+
buffer->Lock(&byte_buffer, &maxLength, &currentLength);
483+
Frame fo = { currentProfile_.format, currentProfile_.width, currentProfile_.height, currentLength, (uint8_t*)byte_buffer };
484484
if (depthFrameProcessor_)
485485
{
486486
depthFrameProcessor_->process(&fo);

modules/videoio/src/cap_obsensor/obsensor_uvc_stream_channel.cpp

Lines changed: 138 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ const uint8_t OB_EXT_CMD2[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0x56, 0x00
4141
const uint8_t OB_EXT_CMD3[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0x58, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
4242
const uint8_t OB_EXT_CMD4[16] = { 0x47, 0x4d, 0x02, 0x00, 0x03, 0x00, 0x60, 0x00, 0xed, 0x03, 0x00, 0x00 };
4343
const uint8_t OB_EXT_CMD5[16] = { 0x47, 0x4d, 0x02, 0x00, 0x03, 0x00, 0x62, 0x00, 0xe9, 0x03, 0x00, 0x00 };
44+
const uint8_t OB_EXT_CMD6[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0x7c, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
45+
const uint8_t OB_EXT_CMD7[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0xfe, 0x12, 0x55, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
46+
const uint8_t OB_EXT_CMD8[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0xfe, 0x13, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
47+
const uint8_t OB_EXT_CMD9[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0xfa, 0x13, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
48+
const uint8_t OB_EXT_CMD10[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0xfa, 0x13, 0x3f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
4449

4550
#if defined(HAVE_OBSENSOR_V4L2)
4651
#define fourCc2Int(a, b, c, d) \
@@ -54,6 +59,7 @@ const std::map<uint32_t, FrameFormat> fourccToOBFormat = {
5459
{fourCc2Int('Y', 'U', 'Y', '2'), FRAME_FORMAT_YUYV},
5560
{fourCc2Int('M', 'J', 'P', 'G'), FRAME_FORMAT_MJPG},
5661
{fourCc2Int('Y', '1', '6', ' '), FRAME_FORMAT_Y16},
62+
{fourCc2Int('Y', '1', '4', ' '), FRAME_FORMAT_Y14},
5763
};
5864

5965
StreamType parseUvcDeviceNameToStreamType(const std::string& devName)
@@ -187,6 +193,54 @@ void DepthFrameProcessor::process(Frame* frame)
187193
}
188194
}
189195

196+
197+
DepthFrameUnpacker::DepthFrameUnpacker(){
198+
outputDataBuf_ = new uint8_t[OUT_DATA_SIZE];
199+
}
200+
201+
DepthFrameUnpacker::~DepthFrameUnpacker(){
202+
delete[] outputDataBuf_;
203+
}
204+
205+
206+
#define ON_BITS(count) ((1 << count) - 1)
207+
#define CREATE_MASK(count, offset) (ON_BITS(count) << offset)
208+
#define TAKE_BITS(source, count, offset) ((source & CREATE_MASK(count, offset)) >> offset)
209+
void DepthFrameUnpacker::process(Frame *frame){
210+
const uint8_t tarStep = 16;
211+
const uint8_t srcStep = 28;
212+
uint16_t *tar = (uint16_t *)outputDataBuf_;
213+
uint8_t *src = frame->data;
214+
215+
uint32_t pixelSize = frame->width * frame->height;
216+
for(uint32_t i = 0; i < pixelSize; i += tarStep) {
217+
tar[0] = (TAKE_BITS(src[0], 8, 0) << 6) | TAKE_BITS(src[1], 6, 2);
218+
tar[1] = (TAKE_BITS(src[1], 2, 0) << 12) | (TAKE_BITS(src[2], 8, 0) << 4) | TAKE_BITS(src[3], 4, 4);
219+
tar[2] = (TAKE_BITS(src[3], 4, 0) << 10) | (TAKE_BITS(src[4], 8, 0) << 2) | TAKE_BITS(src[5], 2, 6);
220+
tar[3] = (TAKE_BITS(src[5], 6, 0) << 8) | TAKE_BITS(src[6], 8, 0);
221+
222+
tar[4] = (TAKE_BITS(src[7], 8, 0) << 6) | TAKE_BITS(src[8], 6, 2);
223+
tar[5] = (TAKE_BITS(src[8], 2, 0) << 12) | (TAKE_BITS(src[9], 8, 0) << 4) | TAKE_BITS(src[10], 4, 4);
224+
tar[6] = (TAKE_BITS(src[10], 4, 0) << 10) | (TAKE_BITS(src[11], 8, 0) << 2) | TAKE_BITS(src[12], 2, 6);
225+
tar[7] = (TAKE_BITS(src[12], 6, 0) << 8) | TAKE_BITS(src[13], 8, 0);
226+
227+
tar[8] = (TAKE_BITS(src[14], 8, 0) << 6) | TAKE_BITS(src[15], 6, 2);
228+
tar[9] = (TAKE_BITS(src[15], 2, 0) << 12) | (TAKE_BITS(src[16], 8, 0) << 4) | TAKE_BITS(src[17], 4, 4);
229+
tar[10] = (TAKE_BITS(src[17], 4, 0) << 10) | (TAKE_BITS(src[18], 8, 0) << 2) | TAKE_BITS(src[19], 2, 6);
230+
tar[11] = (TAKE_BITS(src[19], 6, 0) << 8) | TAKE_BITS(src[20], 8, 0);
231+
232+
tar[12] = (TAKE_BITS(src[21], 8, 0) << 6) | TAKE_BITS(src[22], 6, 2);
233+
tar[13] = (TAKE_BITS(src[22], 2, 0) << 12) | (TAKE_BITS(src[23], 8, 0) << 4) | TAKE_BITS(src[24], 4, 4);
234+
tar[14] = (TAKE_BITS(src[24], 4, 0) << 10) | (TAKE_BITS(src[25], 8, 0) << 2) | TAKE_BITS(src[26], 2, 6);
235+
tar[15] = (TAKE_BITS(src[26], 6, 0) << 8) | TAKE_BITS(src[27], 8, 0);
236+
237+
src += srcStep;
238+
tar += tarStep;
239+
}
240+
frame->data = outputDataBuf_;
241+
frame->format = FRAME_FORMAT_Y16;
242+
}
243+
190244
IUvcStreamChannel::IUvcStreamChannel(const UvcDeviceInfo& devInfo) :
191245
devInfo_(devInfo),
192246
streamType_(parseUvcDeviceNameToStreamType(devInfo_.name))
@@ -198,6 +252,10 @@ StreamType IUvcStreamChannel::streamType() const {
198252
return streamType_;
199253
}
200254

255+
uint16_t IUvcStreamChannel::getPid() const {
256+
return devInfo_.pid;
257+
};
258+
201259
bool IUvcStreamChannel::setProperty(int propId, const uint8_t* /*data*/, uint32_t /*dataSize*/)
202260
{
203261
uint8_t* rcvData;
@@ -206,15 +264,28 @@ bool IUvcStreamChannel::setProperty(int propId, const uint8_t* /*data*/, uint32_
206264
switch (propId)
207265
{
208266
case DEPTH_TO_COLOR_ALIGN:
209-
// todo: value filling
210-
rst &= setXu(2, OB_EXT_CMD0, sizeof(OB_EXT_CMD0));
211-
rst &= getXu(2, &rcvData, &rcvLen);
212-
rst &= setXu(2, OB_EXT_CMD1, sizeof(OB_EXT_CMD1));
213-
rst &= getXu(2, &rcvData, &rcvLen);
214-
rst &= setXu(2, OB_EXT_CMD2, sizeof(OB_EXT_CMD2));
215-
rst &= getXu(2, &rcvData, &rcvLen);
216-
rst &= setXu(2, OB_EXT_CMD3, sizeof(OB_EXT_CMD3));
217-
rst &= getXu(2, &rcvData, &rcvLen);
267+
if(OBSENSOR_GEMINI2_PID == devInfo_.pid ){
268+
rst &= setXu(2, OB_EXT_CMD8, sizeof(OB_EXT_CMD8));
269+
rst &= getXu(2, &rcvData, &rcvLen);
270+
rst &= setXu(2, OB_EXT_CMD6, sizeof(OB_EXT_CMD6));
271+
rst &= getXu(2, &rcvData, &rcvLen);
272+
}
273+
else if(OBSENSOR_ASTRA2_PID == devInfo_.pid ){
274+
rst &= setXu(2, OB_EXT_CMD10, sizeof(OB_EXT_CMD8));
275+
rst &= getXu(2, &rcvData, &rcvLen);
276+
rst &= setXu(2, OB_EXT_CMD6, sizeof(OB_EXT_CMD6));
277+
rst &= getXu(2, &rcvData, &rcvLen);
278+
}
279+
else{
280+
rst &= setXu(2, OB_EXT_CMD0, sizeof(OB_EXT_CMD0));
281+
rst &= getXu(2, &rcvData, &rcvLen);
282+
rst &= setXu(2, OB_EXT_CMD1, sizeof(OB_EXT_CMD1));
283+
rst &= getXu(2, &rcvData, &rcvLen);
284+
rst &= setXu(2, OB_EXT_CMD2, sizeof(OB_EXT_CMD2));
285+
rst &= getXu(2, &rcvData, &rcvLen);
286+
rst &= setXu(2, OB_EXT_CMD3, sizeof(OB_EXT_CMD3));
287+
rst &= getXu(2, &rcvData, &rcvLen);
288+
}
218289
break;
219290
default:
220291
rst = false;
@@ -231,12 +302,50 @@ bool IUvcStreamChannel::getProperty(int propId, uint8_t* recvData, uint32_t* rec
231302
switch (propId)
232303
{
233304
case CAMERA_PARAM:
234-
rst &= setXu(2, OB_EXT_CMD5, sizeof(OB_EXT_CMD5));
235-
rst &= getXu(2, &rcvData, &rcvLen);
236-
if (rst && OB_EXT_CMD5[6] == rcvData[6] && rcvData[8] == 0 && rcvData[9] == 0)
237-
{
238-
memcpy(recvData, rcvData + 10, rcvLen - 10);
239-
*recvDataSize = rcvLen - 10;
305+
if(OBSENSOR_GEMINI2_PID == devInfo_.pid){
306+
// return default param
307+
CameraParam param;
308+
param.p0[0] = 516.652f;
309+
param.p0[1] = 516.692f;
310+
param.p0[2] = 322.988f;
311+
param.p0[3] = 235.787f;
312+
param.p1[0] = 516.652f;
313+
param.p1[1] = 516.692f;
314+
param.p1[2] = 322.988f;
315+
param.p1[3] = 235.787f;
316+
param.p6[0] = 640;
317+
param.p6[1] = 480;
318+
param.p7[0] = 640;
319+
param.p7[1] = 480;
320+
*recvDataSize = sizeof(CameraParam);
321+
memcpy(recvData, &param, *recvDataSize);
322+
}
323+
else if(OBSENSOR_ASTRA2_PID == devInfo_.pid){
324+
// return default param
325+
CameraParam param;
326+
param.p0[0] = 558.151f;
327+
param.p0[1] = 558.003f;
328+
param.p0[2] = 312.546f;
329+
param.p0[3] = 241.169f;
330+
param.p1[0] = 558.151f;
331+
param.p1[1] = 558.003f;
332+
param.p1[2] = 312.546f;
333+
param.p1[3] = 241.169f;
334+
param.p6[0] = 640;
335+
param.p6[1] = 480;
336+
param.p7[0] = 640;
337+
param.p7[1] = 480;
338+
*recvDataSize = sizeof(CameraParam);
339+
memcpy(recvData, &param, *recvDataSize);
340+
}
341+
else{
342+
rst &= setXu(2, OB_EXT_CMD5, sizeof(OB_EXT_CMD5));
343+
rst &= getXu(2, &rcvData, &rcvLen);
344+
if (rst && OB_EXT_CMD5[6] == rcvData[6] && rcvData[8] == 0 && rcvData[9] == 0)
345+
{
346+
memcpy(recvData, rcvData + 10, rcvLen - 10);
347+
*recvDataSize = rcvLen - 10;
348+
}
240349
}
241350
break;
242351
default:
@@ -249,7 +358,20 @@ bool IUvcStreamChannel::getProperty(int propId, uint8_t* recvData, uint32_t* rec
249358

250359
bool IUvcStreamChannel::initDepthFrameProcessor()
251360
{
252-
if (streamType_ == OBSENSOR_STREAM_DEPTH && setXu(2, OB_EXT_CMD4, sizeof(OB_EXT_CMD4)))
361+
if(OBSENSOR_GEMINI2_PID == devInfo_.pid || OBSENSOR_ASTRA2_PID == devInfo_.pid){
362+
uint8_t* rcvData;
363+
uint32_t rcvLen;
364+
365+
setXu(2, OB_EXT_CMD7, sizeof(OB_EXT_CMD7));
366+
getXu(2, &rcvData, &rcvLen);
367+
368+
setXu(2, OB_EXT_CMD9, sizeof(OB_EXT_CMD9));
369+
getXu(2, &rcvData, &rcvLen);
370+
371+
depthFrameProcessor_ = makePtr<DepthFrameUnpacker>();
372+
return true;
373+
}
374+
else if (streamType_ == OBSENSOR_STREAM_DEPTH && setXu(2, OB_EXT_CMD4, sizeof(OB_EXT_CMD4)))
253375
{
254376
uint8_t* rcvData;
255377
uint32_t rcvLen;

modules/videoio/src/cap_obsensor/obsensor_uvc_stream_channel.hpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
#ifdef HAVE_OBSENSOR
2727
namespace cv {
2828
namespace obsensor {
29-
30-
#define OBSENSOR_CAM_VID 0x2bc5 // usb vid
3129
#define XU_MAX_DATA_LENGTH 1024
3230
#define XU_UNIT_ID 4
3331

@@ -60,17 +58,34 @@ struct OBExtensionParam {
6058
float ps;
6159
};
6260

63-
class DepthFrameProcessor {
61+
class IFrameProcessor{
62+
public:
63+
virtual void process(Frame* frame) = 0;
64+
virtual ~IFrameProcessor() = default;
65+
};
66+
67+
class DepthFrameProcessor: public IFrameProcessor {
6468
public:
6569
DepthFrameProcessor(const OBExtensionParam& parma);
66-
~DepthFrameProcessor() noexcept;
67-
void process(Frame* frame);
70+
virtual ~DepthFrameProcessor() noexcept;
71+
virtual void process(Frame* frame) override;
6872

6973
private:
7074
const OBExtensionParam param_;
7175
uint16_t* lookUpTable_;
7276
};
7377

78+
class DepthFrameUnpacker: public IFrameProcessor {
79+
public:
80+
DepthFrameUnpacker();
81+
virtual ~DepthFrameUnpacker() noexcept;
82+
virtual void process(Frame* frame) override;
83+
private:
84+
const uint32_t OUT_DATA_SIZE = 1280*800*2;
85+
uint8_t *outputDataBuf_;
86+
};
87+
88+
7489
class IUvcStreamChannel : public IStreamChannel {
7590
public:
7691
IUvcStreamChannel(const UvcDeviceInfo& devInfo);
@@ -79,6 +94,7 @@ class IUvcStreamChannel : public IStreamChannel {
7994
virtual bool setProperty(int propId, const uint8_t* data, uint32_t dataSize) override;
8095
virtual bool getProperty(int propId, uint8_t* recvData, uint32_t* recvDataSize) override;
8196
virtual StreamType streamType() const override;
97+
virtual uint16_t getPid() const override;
8298

8399
protected:
84100
virtual bool setXu(uint8_t ctrl, const uint8_t* data, uint32_t len) = 0;
@@ -89,7 +105,7 @@ class IUvcStreamChannel : public IStreamChannel {
89105
protected:
90106
const UvcDeviceInfo devInfo_;
91107
StreamType streamType_;
92-
Ptr<DepthFrameProcessor> depthFrameProcessor_;
108+
Ptr<IFrameProcessor> depthFrameProcessor_;
93109
};
94110
}} // namespace cv::obsensor::
95111
#endif // HAVE_OBSENSOR

modules/videoio/src/cap_obsensor_capture.cpp

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ VideoCapture_obsensor::VideoCapture_obsensor(int index) : isOpened_(false)
3434
{
3535
static const obsensor::StreamProfile colorProfile = { 640, 480, 30, obsensor::FRAME_FORMAT_MJPG };
3636
static const obsensor::StreamProfile depthProfile = {640, 480, 30, obsensor::FRAME_FORMAT_Y16};
37+
static const obsensor::StreamProfile gemini2depthProfile = {1280, 800, 30, obsensor::FRAME_FORMAT_Y14};
38+
static const obsensor::StreamProfile astra2depthProfile = {640, 480, 30, obsensor::FRAME_FORMAT_Y14};
3739

3840
streamChannelGroup_ = obsensor::getStreamChannelGroup(index);
3941
if (!streamChannelGroup_.empty())
@@ -47,15 +49,27 @@ VideoCapture_obsensor::VideoCapture_obsensor(int index) : isOpened_(false)
4749
channel->start(colorProfile, [&](obsensor::Frame* frame) {
4850
std::unique_lock<std::mutex> lk(frameMutex_);
4951
colorFrame_ = Mat(1, frame->dataSize, CV_8UC1, frame->data).clone();
52+
frameCv_.notify_all();
5053
});
5154
break;
5255
case obsensor::OBSENSOR_STREAM_DEPTH:
5356
{
5457
uint8_t data = 1;
5558
channel->setProperty(obsensor::DEPTH_TO_COLOR_ALIGN, &data, 1);
56-
channel->start(depthProfile, [&](obsensor::Frame* frame) {
59+
60+
obsensor::StreamProfile profile = depthProfile;
61+
if(OBSENSOR_GEMINI2_PID == channel->getPid()){
62+
profile = gemini2depthProfile;
63+
}
64+
else if(OBSENSOR_ASTRA2_PID == channel->getPid()){
65+
66+
profile = astra2depthProfile;
67+
}
68+
69+
channel->start(profile, [&](obsensor::Frame* frame) {
5770
std::unique_lock<std::mutex> lk(frameMutex_);
5871
depthFrame_ = Mat(frame->height, frame->width, CV_16UC1, frame->data, frame->width * 2).clone();
72+
frameCv_.notify_all();
5973
});
6074

6175
uint32_t len;
@@ -72,10 +86,21 @@ VideoCapture_obsensor::VideoCapture_obsensor(int index) : isOpened_(false)
7286
}
7387
}
7488

89+
VideoCapture_obsensor::~VideoCapture_obsensor(){
90+
for (auto& channel : streamChannelGroup_)
91+
{
92+
channel->stop();
93+
}
94+
streamChannelGroup_.clear();
95+
}
96+
7597
bool VideoCapture_obsensor::grabFrame()
7698
{
7799
std::unique_lock<std::mutex> lk(frameMutex_);
78100

101+
// Try waiting for 33 milliseconds to ensure that both depth and color frame have been received!
102+
frameCv_.wait_for(lk, std::chrono::milliseconds(33), [&](){ return !depthFrame_.empty() && !colorFrame_.empty(); });
103+
79104
grabbedDepthFrame_ = depthFrame_;
80105
grabbedColorFrame_ = colorFrame_;
81106

@@ -93,7 +118,18 @@ bool VideoCapture_obsensor::retrieveFrame(int outputType, OutputArray frame)
93118
case CAP_OBSENSOR_DEPTH_MAP:
94119
if (!grabbedDepthFrame_.empty())
95120
{
96-
grabbedDepthFrame_.copyTo(frame);
121+
if(OBSENSOR_GEMINI2_PID == streamChannelGroup_.front()->getPid()){
122+
grabbedDepthFrame_ = grabbedDepthFrame_*0.8;
123+
Rect rect(320, 160, 640, 480);
124+
grabbedDepthFrame_(rect).copyTo(frame);
125+
}
126+
else if(OBSENSOR_ASTRA2_PID == streamChannelGroup_.front()->getPid()){
127+
grabbedDepthFrame_ = grabbedDepthFrame_*0.8;
128+
grabbedDepthFrame_.copyTo(frame);
129+
}
130+
else{
131+
grabbedDepthFrame_.copyTo(frame);
132+
}
97133
grabbedDepthFrame_.release();
98134
return true;
99135
}

0 commit comments

Comments
 (0)