Example with CPP
- There are several steps to get camera data:
Create a camera instance.
Get camera resources
Start the camera.
Request a frame.
Get Depth Data or Intensity Data from frame
Release frame to buffer queue
Stop the camera’s image acquisition thread
Close the camera to free up resources
example
#include "ArducamTOFCamera.hpp" #include <chrono> #include <fstream> #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace Arducam; #define MAX_DISTANCE 4000 int max_width = 240; int max_height = 180; int max_range = 0; int confidence_value = 30; void display_fps(void) { using std::chrono::high_resolution_clock; using namespace std::literals; static int count = 0; static auto time_beg = high_resolution_clock::now(); auto time_end = high_resolution_clock::now(); ++count; auto duration_ms = (time_end - time_beg) / 1ms; if (duration_ms >= 1000) { std::cout << "fps:" << count << std::endl; count = 0; time_beg = time_end; } } cv::Mat matRotateClockWise180(cv::Mat src) { if (src.empty()) { std::cerr << "RorateMat src is empty!"; } flip(src, src, 0); flip(src, src, 1); return src; } void getPreviewRGB(cv::Mat preview_ptr, cv::Mat amplitude_image_ptr) { preview_ptr.setTo(cv::Scalar(0, 0, 0), amplitude_image_ptr < confidence_value); // cv::GaussianBlur(preview_ptr, preview_ptr, cv::Size(7, 7), 0); } void onMouse(int event, int x, int y, int flags, void* param) { if (x < 4 || x > (max_width - 4) || y < 4 || y > (max_height - 4)) return; switch (event) { case cv::EVENT_LBUTTONDOWN: break; case cv::EVENT_LBUTTONUP: seletRect.x = x - 4 ? x - 4 : 0; seletRect.y = y - 4 ? y - 4 : 0; seletRect.width = 8; seletRect.height = 8; break; default: followRect.x = x - 4 ? x - 4 : 0; followRect.y = y - 4 ? y - 4 : 0; followRect.width = 8; followRect.height = 8; break; } } int main() { ArducamTOFCamera tof; ArducamFrameBuffer* frame; if (tof.open(Connection::CSI, 0)) { std::cerr << "Failed to open camera" << std::endl; return -1; } if (tof.start(FrameType::DEPTH_FRAME)) { std::cerr << "Failed to start camera" << std::endl; return -1; } // Modify the range also to modify the MAX_DISTANCE tof.setControl(CameraCtrl::RANGE, MAX_DISTANCE); tof.getControl(CameraCtrl::RANGE, &max_range); auto info = tof.getCameraInfo(); std::cout << "open camera with (" << info.width << "x" << info.height << ")" << std::endl; uint8_t* preview_ptr = new uint8_t[info.width * info.height * 2]; cv::namedWindow("preview", cv::WINDOW_AUTOSIZE); cv::setMouseCallback("preview", onMouse); for (;;) { Arducam::FrameDataFormat format; frame = tof.requestFrame(200); if (frame == nullptr) { continue; } frame->getFrameDataFormat(FrameType::DEPTH_FRAME, format); std::cout << "frame: (" << format.width << "x" << format.height << ")" << std::endl; max_height = format.height; max_width = format.width; float* depth_ptr = (float*)frame->getData(FrameType::DEPTH_FRAME); float* confidence_ptr = (float*)frame->getData(FrameType::CONFIDENCE_FRAME); cv::Mat result_frame(format.height, format.width, CV_8U, preview_ptr); cv::Mat depth_frame(format.height, format.width, CV_32F, depth_ptr); cv::Mat confidence_frame(format.height, format.width, CV_32F, confidence_ptr); depth_frame.convertTo(result_frame, CV_8U, 255.0 / 7000, 0); cv::applyColorMap(result_frame, result_frame, cv::COLORMAP_RAINBOW); getPreviewRGB(result_frame, confidence_frame); confidence_frame.convertTo(confidence_frame, CV_8U, 255.0 / 1024, 0); cv::imshow("confidence", confidence_frame); cv::rectangle(result_frame, seletRect, cv::Scalar(0, 0, 0), 2); cv::rectangle(result_frame, followRect, cv::Scalar(255, 255, 255), 1); std::cout << "select Rect distance: " << cv::mean(depth_frame(seletRect)).val[0] << std::endl; cv::imshow("preview", result_frame); auto key = cv::waitKey(1); if (key == 27 || key == 'q') { break; } display_fps(); tof.releaseFrame(frame); } if (tof.stop()) { return -1; } if (tof.close()) { return -1; } return 0; }
Note
For specific function usage details, please refer to the API