> # ♻️ 资源
> **大小:** 2.57MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010475**](https://www.yuque.com/sxbn/ks/100010475)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87390870**](https://download.csdn.net/download/s1t16/87390870)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 直线检测、圆检测
# 实验内容和要求
输入一张彩色图像,要求能够检测出其中的直线、圆。
# 实验器材
C++ OpenCV 4.5.0 开发平台:Visual Studio 2019 Debug x64
![322a28995db952910f66d747c7208890.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936507488-2fbe53eb-21dc-4016-86fa-56318d192103.png#averageHue=%23edf0ed&clientId=u3e515bed-da69-4&from=paste&height=24&id=uc506818e&originHeight=30&originWidth=158&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=2786&status=done&style=none&taskId=uaaa63372-b406-492b-90b8-52caebbeedb&title=&width=126.4)![9ecc8c48019a5402b3cf958a4aad71e8.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936507541-a19ce10e-1649-4f6b-8f5d-2feafede1264.png#averageHue=%23f4f4f4&clientId=u3e515bed-da69-4&from=paste&height=345&id=uca474291&originHeight=431&originWidth=1134&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=46910&status=done&style=none&taskId=u5fae382a-c9d3-41cc-b300-a631dfa23a5&title=&width=907.2)
# 具体实现
## 3.1 直线检测——利用 Hough 变换
### 3.1.1 构造 Hough 空间
直线检测的 Hough 空间是对直角坐标系下的(x, y)映射到极坐标系下的(ρ,θ)后,以ρ和θ为轴建立的坐标系空间。映射关系如下图所示:
对于一副大小为 D×D 的图像,通常 ρ 的取值范围为[90,90]。计算方法与直角坐标系中累加器的计算方法相同,最后得到最大的 A 所对应的(ρ,θ)。累加器的构造代码如下:
![9b674b9178b549b27979d5f2a7803653.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936527778-80d299f4-1ac0-4da2-94b9-d24dc975f5b9.png#averageHue=%23fdfdfd&clientId=u3e515bed-da69-4&from=paste&height=225&id=u5a4dbf06&originHeight=281&originWidth=828&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=32723&status=done&style=none&taskId=u522d22a8-1c13-4dc2-844b-c9ea911fc15&title=&width=662.4)
### 3.1.2 边缘检测
我自己实现了 Sobel 算子的检测,但是在面对比较复杂的图形时,效果不是特别好。在此处将 Sobel 边缘检测和 Canny 边缘检测都写出来,并比较结果。
Sobel 算子采用了边缘中心权值为 2 的版本,分别对 x 和 y 方向做了卷积,并且计算了方向。
![18a7b816a86ed4e14c7189efc0765211.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936545255-2ca70d97-df67-4f38-a188-c0280cd39ddc.png#averageHue=%23f3f3eb&clientId=u3e515bed-da69-4&from=paste&height=413&id=uf38c94c8&originHeight=516&originWidth=732&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=82183&status=done&style=none&taskId=uac2d5da9-00fd-49a3-9bde-5eb7b5f22e4&title=&width=585.6)
Canny 边缘检测使用了 OpenCV 自带的函数:先进行一次高斯平滑,掩膜的大小由图像本身大小决定,然后用 Canny 函数进行检测。
![4dd092231735ef2ad4ebad2e8912f010.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936560428-c2092983-1d9a-45de-87d5-27be305a62ce.png#averageHue=%23f7fcfb&clientId=u3e515bed-da69-4&from=paste&height=35&id=ufe6cb643&originHeight=44&originWidth=396&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8758&status=done&style=none&taskId=u3372a9e0-b654-4533-9ceb-34633df66e4&title=&width=316.8)
对同一张图片进行两种方法滤波,结果如下:
![20c27135c8f95453e07ad0311badfb48.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936575238-f70f21ff-fd94-4428-ad4d-86d9cf901ab7.png#averageHue=%230f0f0f&clientId=u3e515bed-da69-4&from=paste&height=415&id=uc78eb644&originHeight=519&originWidth=1308&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=119985&status=done&style=none&taskId=u55c7f964-0c90-4ef6-b344-70e104a30c9&title=&width=1046.4)
左图为自己实现的 Sobel 算子检测结果,运算速度一般;右图为平滑滤波+Canny 检测的结果,运算速度很快。
### 3.1.3 对边缘点统计,投票,更新累加器
对检测完毕的边缘图像中的“边缘点”,在每一个θ进行遍历,计算出对应的ρ,投票(对应在Hough 空间的累加器里加 1)。
![fca69e6a4e2633178af9194fd6fc2188.PNg](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936599128-e7ed6539-76b7-4443-b2a4-162694d38036.png#averageHue=%23fdfdfd&clientId=u3e515bed-da69-4&from=paste&height=240&id=uadf39f1f&originHeight=300&originWidth=896&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=43861&status=done&style=none&taskId=u2d1b4878-6a0c-42a9-b22b-b1b7761e67a&title=&width=716.8)
### 3.1.4 按照一定的阈值进行输出和绘制
遍历 Hough 空间(累加器),对于最多的交点(也就是比较大的值)处,提取ρ和θ还原原直线信息,并且绘制在图上。
结果分析与改进请见第四部分。
## 3.2 圆检测——利用 Hough 变换
一个圆的确定需要三个参数:两个参数用来确定圆心,一个参数用来确定半径。
### 3.2.1 构建 Hough 空间
圆检测的 Hough 累加器可以理解成一个三维数组(空间盒),长宽是原图像的长宽,深度是对半径的预测和累计。对于圆检测首先规定了一个半径的范围,只检测半径长度在该范围内的圆。
![f36270985d41b531caa116c243a37893.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936622788-ce4c820f-d8ab-4a92-836e-bcbe77ec9101.png#averageHue=%23f4f6ee&clientId=u3e515bed-da69-4&from=paste&height=289&id=u044d8f53&originHeight=361&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=38486&status=done&style=none&taskId=u1ee0820d-b91f-45a7-afea-a9da6c3de54&title=&width=275.2)
### 3.2.2 遍历边缘检测图像,统计与投票
对于边缘点,遍历所有可能的半径 r,根据圆的参数方程进行解析,得出两个可以确定圆心的点,对相应的累加器加 1。
![d898caf0183318506fec1eacb36b1b32.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936639468-3ef7f859-8e6e-477e-bd89-78b9a1790f37.png#averageHue=%23f0efe9&clientId=u3e515bed-da69-4&from=paste&height=313&id=u9b07dc19&originHeight=391&originWidth=611&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=56191&status=done&style=none&taskId=u2fe0d7cb-9b3c-4d6b-ad8f-fd116055224&title=&width=488.8)
### 3.2.3 根据阈值还原检测圆
![34184389f275c17f6fc81cf914892fff.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711936653282-6662c6fe-8753-4fd7-b3ef-6ddb48e57bc0.png#averageHue=%23fdfdfc&clientId=u3e515bed-da69-4&from=paste&height=590&id=u77c76bd3&originHeight=737&originWidth=727&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=91662&status=done&style=none&taskId=uc45f5b04-6e60-4fe5-8aa8-cd554942c93&title=&width=581.6)
在筛选与重现的过程中做了一次根据距离的筛选,即两个圆的圆心之间的距离,以防止很多重复。
# 实验结果与分析
## 4.1 直线检测分析
遍历全图的计算量很大,主要是在每一个需要检测的点的余弦值和正弦值的计算,因此在计算之前先对 0 到 180 的所有角度的余弦值和正弦值做了哈希表,用于后面的直接索引。这样一来加速了算法。
![3cf2d383b9fe6ab1ed1c8e5cbd71b
没有合适的资源?快使用搜索试试~ 我知道了~
基于 C++实现直线检测、圆检测【100010475】
共19个文件
jpg:11个
sln:1个
pdf:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 73 浏览量
2023-01-18
10:45:42
上传
评论
收藏 2.57MB ZIP 举报
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010475 C++ OpenCV 4.5.0 开发平台:Visual Studio 2019 Debug x64 实验内容和要求:输入一张彩色图像,要求能够检测出其中的直线、圆。
资源推荐
资源详情
资源评论
收起资源包目录
100010475-基于 C++实现直线检测、圆检测.zip (19个子文件)
line-round-detection
result_img
circle_hw-seal.jpg 98KB
line_2.jpg 25KB
line_sudoku.jpg 29KB
circle_hw-coin.JPG 205KB
line_hw-seal.jpg 98KB
line_hw-highway.jpg 477KB
report.pdf 1.2MB
test_img
2.jpg 15KB
hw-highway.jpg 205KB
sudoku.jpg 15KB
hw-seal.jpg 86KB
hw-coin.JPG 212KB
LICENSE 1KB
exe
Hw.exe 211KB
README.md 15KB
code
Hw
Hw.vcxproj.filters 936B
main.cpp 13KB
Hw.vcxproj 7KB
Hw.sln 1KB
共 19 条
- 1
资源评论
神仙别闹
- 粉丝: 2714
- 资源: 7669
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功