opencv 采用三个线程 分别进行图像采集 canny边缘检测和图像显示 一共采集处理显示100张图片 计算每张图片用时并输出 c++
时间: 2024-06-09 12:06:33 浏览: 7
下面是一个简单的示例代码,展示了如何使用OpenCV在三个线程中进行图像采集、Canny边缘检测和图像显示,并输出每张图片的处理时间:
```c++
#include <iostream>
#include <thread>
#include <chrono>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
using namespace chrono;
// 采集线程
void capture_thread(VideoCapture& cap, Mat& frame, bool& stop_capture)
{
while (!stop_capture) {
cap >> frame;
}
}
// 处理线程
void process_thread(Mat& frame, Mat& edges, bool& stop_process)
{
while (!stop_process) {
Canny(frame, edges, 50, 200);
}
}
// 显示线程
void display_thread(Mat& frame, Mat& edges, bool& stop_display)
{
while (!stop_display) {
imshow("Camera", frame);
imshow("Edges", edges);
waitKey(1);
}
}
int main()
{
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "Failed to open camera" << endl;
return -1;
}
// 创建Mat对象
Mat frame, edges;
// 创建标志变量
bool stop_capture = false;
bool stop_process = false;
bool stop_display = false;
// 创建线程
thread capture_thr(capture_thread, ref(cap), ref(frame), ref(stop_capture));
thread process_thr(process_thread, ref(frame), ref(edges), ref(stop_process));
thread display_thr(display_thread, ref(frame), ref(edges), ref(stop_display));
// 计时并输出每张图片的处理时间
int count = 0;
steady_clock::time_point start_time, end_time;
while (count < 100) {
start_time = steady_clock::now();
// 暂停一段时间等待线程处理完当前帧
this_thread::sleep_for(milliseconds(50));
end_time = steady_clock::now();
cout << "Frame " << count << " processing time: " << duration_cast<milliseconds>(end_time - start_time).count() << "ms" << endl;
count++;
}
// 停止线程
stop_capture = true;
stop_process = true;
stop_display = true;
// 等待线程结束
capture_thr.join();
process_thr.join();
display_thr.join();
return 0;
}
```
在上面的示例代码中,我们首先打开摄像头,并创建了三个Mat对象:frame(用于存储原始图像)、edges(用于存储Canny边缘检测结果)和stop_capture(用于控制图像采集线程的运行)。然后,我们创建了三个线程:capture_thr(用于采集图像)、process_thr(用于处理图像)和display_thr(用于显示图像)。在主线程中,我们使用计时器计算每张图片的处理时间,并输出到控制台。最后,我们停止三个线程,并等待它们结束。
请注意,在实际应用中,我们可能需要对线程的运行速度进行更精细的控制,以确保图像采集、处理和显示之间的同步性。此外,我们还需要考虑如何处理图像采集失败、处理失败或显示失败等异常情况。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)