Skip to content

Commit f081076

Browse files
committed
Add multi-camera video example
1 parent a36d00c commit f081076

7 files changed

+216
-28
lines changed

CMakeLists.txt

+15
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,21 @@ if(BUILD_EXAMPLES)
171171
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
172172
)
173173

174+
##### Multi-camera Video Example
175+
set(MULTICAM_VIDEO_EXAMPLE ${PROJECT_NAME}_multicam_video_example)
176+
add_executable(${MULTICAM_VIDEO_EXAMPLE} "${PROJECT_SOURCE_DIR}/examples/zed_oc_multi_video_example.cpp")
177+
set_target_properties(${MULTICAM_VIDEO_EXAMPLE} PROPERTIES PREFIX "")
178+
set_property(TARGET ${MULTICAM_VIDEO_EXAMPLE} PROPERTY POSITION_INDEPENDENT_CODE ON)
179+
target_link_libraries(${MULTICAM_VIDEO_EXAMPLE}
180+
${PROJECT_NAME}
181+
${OpenCV_LIBS}
182+
)
183+
install(TARGETS ${MULTICAM_VIDEO_EXAMPLE}
184+
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
185+
)
186+
187+
188+
174189
##### Control Example
175190
set(CONTROL_EXAMPLE ${PROJECT_NAME}_control_example)
176191
add_executable(${CONTROL_EXAMPLE} "${PROJECT_SOURCE_DIR}/examples/zed_oc_control_example.cpp")

changelog.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
v0.6.0 - 2022 11 04
4+
-------------------
5+
* Add multi-camera video example
6+
37
v0.5.0 - 2021 09 10
48
-------------------
59
* Add example to extract disparity map, depth map and point cloud using OpenCV and T-API (OpenCL)
+151
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
////////////////////////////////////////////////////////////////////////////
2+
////
3+
//// Copyright (c) 2021, STEREOLABS.
4+
////
5+
//// All rights reserved.
6+
////
7+
//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8+
//// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9+
//// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10+
//// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
11+
//// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12+
//// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
13+
//// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
14+
//// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
15+
//// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
16+
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17+
//// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
18+
////
19+
/////////////////////////////////////////////////////////////////////////////
20+
21+
//// ----> Includes
22+
#include "videocapture.hpp"
23+
#include "ocv_display.hpp"
24+
25+
#include <iostream>
26+
#include <iomanip>
27+
28+
#include <opencv2/opencv.hpp>
29+
// <---- Includes
30+
31+
// #define TEST_FPS 1
32+
33+
// The main function
34+
int main(int argc, char *argv[])
35+
{
36+
// ----> Silence unused warning
37+
(void)argc;
38+
(void)argv;
39+
// <---- Silence unused warning
40+
41+
sl_oc::video::VideoParams params;
42+
params.res = sl_oc::video::RESOLUTION::HD720;
43+
params.fps = sl_oc::video::FPS::FPS_60;
44+
45+
// ----> Create Video Capture 0
46+
sl_oc::video::VideoCapture cap_0(params);
47+
if( !cap_0.initializeVideo(0) )
48+
{
49+
std::cerr << "Cannot open camera video capture" << std::endl;
50+
std::cerr << "See verbosity level for more details." << std::endl;
51+
52+
return EXIT_FAILURE;
53+
}
54+
55+
std::cout << "Connected to camera sn: " << cap_0.getSerialNumber() << " [" << cap_0.getDeviceName() << "]" << std::endl;
56+
// <---- Create Video Capture 0
57+
58+
// ----> Create Video Capture 1
59+
sl_oc::video::VideoCapture cap_1(params);
60+
if( !cap_1.initializeVideo(2) )
61+
{
62+
std::cerr << "Cannot open camera video capture" << std::endl;
63+
std::cerr << "See verbosity level for more details." << std::endl;
64+
65+
return EXIT_FAILURE;
66+
}
67+
68+
std::cout << "Connected to camera sn: " << cap_1.getSerialNumber() << " [" << cap_1.getDeviceName() << "]" << std::endl;
69+
// <---- Create Video Capture 1
70+
71+
// Set video parameters
72+
bool autoSettingEnable = true;
73+
cap_0.setAutoWhiteBalance(autoSettingEnable);
74+
cap_0.setAECAGC(autoSettingEnable);
75+
76+
cap_1.setAutoWhiteBalance(autoSettingEnable);
77+
cap_1.setAECAGC(autoSettingEnable);
78+
79+
80+
#ifdef TEST_FPS
81+
// Timestamp to check FPS
82+
double lastTime = static_cast<double>(getSteadyTimestamp())/1e9;
83+
// Frame timestamp to check FPS
84+
uint64_t lastFrameTs = 0;
85+
#endif
86+
87+
// Infinite video grabbing loop
88+
while (1)
89+
{
90+
// Get last available frame
91+
const sl_oc::video::Frame frame_0 = cap_0.getLastFrame();
92+
const sl_oc::video::Frame frame_1 = cap_1.getLastFrame();
93+
94+
// ----> If the frame is valid we can display it
95+
if(frame_0.data!=nullptr && frame_1.data!=nullptr)
96+
{
97+
#ifdef TEST_FPS
98+
if(lastFrameTs!=0)
99+
{
100+
// ----> System time
101+
double now = static_cast<double>(getSteadyTimestamp())/1e9;
102+
double elapsed_sec = now - lastTime;
103+
lastTime = now;
104+
std::cout << "[System] Frame period: " << elapsed_sec << "sec - Freq: " << 1./elapsed_sec << " Hz" << std::endl;
105+
// <---- System time
106+
107+
// ----> Frame time
108+
double frame_dT = static_cast<double>(frame.timestamp-lastFrameTs)/1e9;
109+
std::cout << "[Camera] Frame period: " << frame_dT << "sec - Freq: " << 1./frame_dT << " Hz" << std::endl;
110+
// <---- Frame time
111+
}
112+
lastFrameTs = frame.timestamp;
113+
#endif
114+
115+
// ----> Conversion from YUV 4:2:2 to BGR for visualization
116+
cv::Mat frameYUV_0 = cv::Mat( frame_0.height, frame_0.width, CV_8UC2, frame_0.data );
117+
cv::Mat frameBGR_0;
118+
cv::Mat frameYUV_1 = cv::Mat( frame_1.height, frame_1.width, CV_8UC2, frame_1.data );
119+
cv::Mat frameBGR_1;
120+
cv::cvtColor(frameYUV_0,frameBGR_0,cv::COLOR_YUV2BGR_YUYV);
121+
cv::cvtColor(frameYUV_1,frameBGR_1,cv::COLOR_YUV2BGR_YUYV);
122+
// <---- Conversion from YUV 4:2:2 to BGR for visualization
123+
124+
// Show frame
125+
sl_oc::tools::showImage( "Stream RGB #0", frameBGR_0, params.res );
126+
sl_oc::tools::showImage( "Stream RGB #1", frameBGR_1, params.res );
127+
}
128+
// <---- If the frame is valid we can display it
129+
130+
// ----> Keyboard handling
131+
int key = cv::waitKey( 5 );
132+
if(key=='q' || key=='Q') // Quit
133+
break;
134+
if(key=='a' || key=='A')
135+
{
136+
autoSettingEnable = !autoSettingEnable;
137+
cap_0.setAutoWhiteBalance(autoSettingEnable);
138+
cap_0.setAECAGC(autoSettingEnable);
139+
140+
cap_1.setAutoWhiteBalance(autoSettingEnable);
141+
cap_1.setAECAGC(autoSettingEnable);
142+
143+
std::cout << "Auto GAIN/EXPOSURE and Auto White Balance: " << (autoSettingEnable?"ENABLED":"DISABLED") << std::endl;
144+
}
145+
// <---- Keyboard handling
146+
}
147+
148+
return EXIT_SUCCESS;
149+
}
150+
151+

examples/zed_oc_video_example.cpp

+27-26
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
///////////////////////////////////////////////////////////////////////////
2-
//
3-
// Copyright (c) 2021, STEREOLABS.
4-
//
5-
// All rights reserved.
6-
//
7-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
11-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
13-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
14-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
15-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
16-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
18-
//
19-
///////////////////////////////////////////////////////////////////////////
20-
21-
// ----> Includes
1+
////////////////////////////////////////////////////////////////////////////
2+
////
3+
//// Copyright (c) 2021, STEREOLABS.
4+
////
5+
//// All rights reserved.
6+
////
7+
//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8+
//// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9+
//// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10+
//// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
11+
//// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12+
//// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
13+
//// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
14+
//// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
15+
//// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
16+
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17+
//// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
18+
////
19+
/////////////////////////////////////////////////////////////////////////////
20+
21+
//// ----> Includes
2222
#include "videocapture.hpp"
2323
#include "ocv_display.hpp"
2424

@@ -38,20 +38,21 @@ int main(int argc, char *argv[])
3838
(void)argv;
3939
// <---- Silence unused warning
4040

41-
// ----> Create Video Capture
4241
sl_oc::video::VideoParams params;
4342
params.res = sl_oc::video::RESOLUTION::HD720;
4443
params.fps = sl_oc::video::FPS::FPS_60;
4544

46-
sl_oc::video::VideoCapture cap(params);
47-
if( !cap.initializeVideo() )
45+
// ----> Create Video Capture
46+
sl_oc::video::VideoCapture cap_0(params);
47+
if( !cap_0.initializeVideo() )
4848
{
4949
std::cerr << "Cannot open camera video capture" << std::endl;
5050
std::cerr << "See verbosity level for more details." << std::endl;
5151

5252
return EXIT_FAILURE;
5353
}
54-
std::cout << "Connected to camera sn: " << cap.getSerialNumber() << std::endl;
54+
55+
std::cout << "Connected to camera sn: " << cap_0.getSerialNumber() << "[" << cap_0.getDeviceName() << "]" << std::endl;
5556
// <---- Create Video Capture
5657

5758

@@ -67,7 +68,7 @@ int main(int argc, char *argv[])
6768
while (1)
6869
{
6970
// Get last available frame
70-
const sl_oc::video::Frame frame = cap.getLastFrame();
71+
const sl_oc::video::Frame frame = cap_0.getLastFrame();
7172

7273
// ----> If the frame is valid we can display it
7374
if(frame.data!=nullptr)

include/defines.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444

4545
//// SDK VERSION NUMBER
4646
#define ZED_OC_MAJOR_VERSION 0
47-
#define ZED_OC_MINOR_VERSION 5
48-
#define ZED_OC_PATCH_VERSION 1
47+
#define ZED_OC_MINOR_VERSION 6
48+
#define ZED_OC_PATCH_VERSION 0
4949

5050
#define ZED_OC_VERSION_ATTRIBUTE private: uint32_t mMajorVer = ZED_OC_MAJOR_VERSION, mMinorVer = ZED_OC_MINOR_VERSION, mPatchVer = ZED_OC_PATCH_VERSION
5151

include/videocapture.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,18 @@ class SL_OC_EXPORT VideoCapture
345345
*/
346346
void setColorBars(int side, bool c);
347347

348+
/*!
349+
* \brief Retrieve the OS device name
350+
* \return the OS device name
351+
*/
352+
inline std::string getDeviceName(){return mDevName;}
353+
354+
/*!
355+
* \brief Retrieve the OS device index
356+
* \return the OS device index
357+
*/
358+
inline int getDeviceId(){return mDevId;}
359+
348360
#ifdef SENSOR_LOG_AVAILABLE
349361
/*!
350362
* \brief Start logging to file of AEG/AGC camera registers

src/videocapture.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,8 @@ int VideoCapture::ll_VendorControl(uint8_t *buf, int len, int readMode, bool saf
928928

929929
int io_err = ioctl(mFileDesc, UVCIOC_CTRL_QUERY, &xu_query_info);
930930

931+
//std::cerr << "[ll_VendorControl] '" << mDevName << "' [" << mDevId << "] - mFileDesc: " << mFileDesc << std::endl;
932+
931933
if (io_err != 0)
932934
{
933935
return -4;
@@ -1477,6 +1479,9 @@ void VideoCapture::setCameraControlSettings(int ctrl_id, int ctrl_val) {
14771479

14781480
// save_controls(fd);
14791481
queryctrl.id = ctrl_id;
1482+
1483+
//std::cerr << "[setCameraControlSettings] '" << mDevName << "' [" << mDevId << "] - mFileDesc: " << mFileDesc << std::endl;
1484+
14801485
int res = ioctl(mFileDesc, VIDIOC_QUERYCTRL, &queryctrl);
14811486
if (0 == res) {
14821487
min = queryctrl.minimum;

0 commit comments

Comments
 (0)