c++ - 使用 OpenCV 检测红色矩形(或正方形)
问题描述
我是 OpenCv 的新手,我需要检测图像中的红色矩形。
我发现了很多如何用 OpenCV 检测红色圆圈的例子,比如这个。但,
如何使用 OpenCV 和 C++ 检测红色矩形?
我想和上面的教程一样,识别这个圈子:
但是,我想识别矩形和正方形,而不是圆形。我想从最简单的部分开始,接下来我将改变照明条件。
解决方案
由于您是新手,我建议您使用最简单的方法来检测形状对象,例如矩形。首先,您将对分割图像应用阈值处理(您可以使用Canny()
),然后使用矩形提取轮廓findContours()
,最后使用approxPolyDP()
- 它根据我们指定的精度将轮廓形状近似为具有较少顶点数的另一个形状。它是 Douglas-Peucker 算法的一种实现。
cv::Mat src = ...;
cv::Mat gray = ...;
cv::Mat bw;
cv::Canny(gray, bw, 800, 850, 5, true); // Modify values for your use-case
std::vector<std::vector<cv::Point>> countours;
cv::findContours(bw.clone(), countours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
std::vector<cv::Point> approx;
cv::Mat dst = src.clone();
for(int i = 0; i < countours.size(); i++)
{
cv::approxPolyDP(Mat(countours[i]), approx, arcLength(Mat(countours[i]), true) * 0.01, true);
if (approx.size() == 4)
{
double maxCosine = 0;
for (int j = 2; j < 5; j++)
{
double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
maxCosine = MAX(maxCosine, cosine);
}
if (maxCosine < 1.2)
{
cv::line(dst, approx.at(0), approx.at(1), cvScalar(0,0,255), 4);
cv::line(dst, approx.at(1), approx.at(2), cvScalar(0,0,255), 4);
cv::line(dst, approx.at(2), approx.at(3), cvScalar(0,0,255), 4);
cv::line(dst, approx.at(3), approx.at(0), cvScalar(0,0,255), 4);
}
}
}
推荐阅读
- python - 在python中按日期获取唯一列值
- ruby - 如何修复安装 gem ruby2d 时找不到所需的包的错误?
- android - 如何在 Recyclerview 中添加背景图片?
- c++ - C++ 你能在构造函数或析构函数中引用 this 指针吗?
- c++ - 无法分配类成员指针变量
- r - 在R中将时间序列转换为数据框
- swift - SwiftUI binding bool outside view - '访问安装在视图之外的状态值'
- python - 如何从 tkinter 中的选定行中获取数据?
- c++ - 在没有资源文件的 C++ 中设置 shell 图标
- javascript - 如何使用反应钩子将对象数据从子组件发送到父组件并存储在父对象中?