能否提供一份用OpenCV编写的C++代码示例,用于智能小车的自动循迹功能?
时间: 2024-12-22 22:22:27 浏览: 6
当然可以,下面是一个简单的OpenCV C++代码示例,它展示了如何使用OpenCV处理摄像头输入,并通过颜色跟踪来实现智能小车的自动循迹功能。这个例子假设我们正在追踪红色目标。
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
// 定义颜色范围
cv::Scalar lowerColor(0, 50, 50);
cv::Scalar upperColor(10, 255, 255);
int main(int argc, char** argv)
{
cv::VideoCapture cap(0); // 使用默认摄像头
if (!cap.isOpened())
{
std::cerr << "Error opening camera." << std::endl;
return -1;
}
while (true)
{
cv::Mat frame;
cap >> frame;
if (frame.empty()) break; // 如果读取帧失败则退出
cv::cvtColor(frame, frame, cv::COLOR_BGR2HSV); // 转换到HSV空间以便于颜色检测
cv::inRange(frame, lowerColor, upperColor, frame); // 创建掩码,仅保留红光区域
cv::threshold(frame, frame, 127, 255, cv::THRESH_BINARY); // 对图像二值化
// 找到轮廓并选择最大的一个作为目标
std::vector<std::vector<cv::Point>> contours;
cv::findContours(frame, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::sort(contours, [](const std::vector<cv::Point>& a, const std::vector<cv::Point>& b) {return a.size() > b.size();});
if (!contours.empty())
{
cv::RotatedRect rect = cv::minAreaRect(contours[0]); // 计算最小外接矩形
double angle = rect.angle * CV_PI / 180; // 将角度转换为弧度
// 根据角度调整小车的转向命令...
// 这里只是一个简化版的示例,实际应用中你需要将角度转换为具体的控制信号,如PWM脉冲等
int steering_angle = angle * 180 / CV_PI; // 可能需要限制角度范围
// 显示结果
cv::drawContours(frame, contours, 0, cv:: Scalar(255, 0, 0), 2);
cv::putText(frame, "Angle: " + std::to_string(steering_angle), cv::Point(10, 30),
cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 1);
}
cv::imshow("Tracking", frame);
if (cv::waitKey(1) == 27) break; // 按ESC键停止
}
cap.release();
cv::destroyAllWindows();
return 0;
}
```
阅读全文