12 int main(
int argc,
char** argv) {
14 using namespace std::chrono;
18 std::string nnPath(BLOB_PATH);
21 nnPath = std::string(argv[1]);
33 camOut->setStreamName(
"preview");
37 camRgb->setPreviewSize(300, 300);
39 camRgb->setInterleaved(
false);
44 nn->input.setBlocking(
false);
45 nn->input.setQueueSize(1);
46 nn->setBlobPath(nnPath);
48 nn->setNumInferenceThreads(2);
52 camRgb->preview.link(camOut->input);
53 nn->out.link(resultOut->
input);
57 std::deque<cv::Mat> queue;
58 std::atomic<bool> running{
true};
61 std::thread workerThread([&running, &queueMtx, &queue, &pipeline]() {
73 nanoseconds sumLatency{0};
74 milliseconds avgLatency{0};
76 int nnFps = 0, lastNnFps = 0;
77 int camFps = 0, lastCamFps = 0;
78 auto lastTime = steady_clock::now();
93 cv::Mat frame =
toMat(preview->getData(), preview->getWidth(), preview->getHeight(), 3, 1);
96 for(
const auto& d : prevResult->detections) {
97 int x1 = d.xmin * frame.cols;
98 int y1 = d.ymin * frame.rows;
99 int x2 = d.xmax * frame.cols;
100 int y2 = d.ymax * frame.rows;
101 cv::rectangle(frame, cv::Rect(cv::Point(x1, y1), cv::Point(x2, y2)), cv::Scalar(255, 255, 255));
105 cv::putText(frame, std::string(
"NN: ") +
std::to_string(lastNnFps), cv::Point(5, 20), cv::FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 0));
106 cv::putText(frame, std::string(
"Cam: ") +
std::to_string(lastCamFps), cv::Point(5, 50), cv::FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 0));
109 cv::Point(frame.cols - 120, 20),
110 cv::FONT_HERSHEY_PLAIN,
112 cv::Scalar(255, 0, 0));
116 std::unique_lock<std::mutex> l(queueMtx);
117 queue.push_back(std::move(frame));
121 if(preview->getSequenceNum() >= result->getSequenceNum() - 1) {
123 sumLatency = sumLatency + (steady_clock::now() - preview->getTimestamp());
125 if(steady_clock::now() - lastTime >= seconds(1)) {
135 avgLatency = duration_cast<milliseconds>(sumLatency / numFrames);
136 sumLatency = nanoseconds(0);
140 lastTime = steady_clock::now();
154 using namespace std::chrono;
157 auto t1 = steady_clock::now();
159 std::unique_lock<std::mutex> l(queueMtx);
161 frame = queue.front();
166 cv::imshow(
"frame", frame);
168 auto toSleep = (seconds(1) /
CAMERA_FPS) - (steady_clock::now() - t1);
169 if(toSleep > milliseconds(0)) {
170 if(cv::waitKey(duration_cast<milliseconds>(toSleep).count()) ==
'q') {