opencv demo

w 3f876c7cf7 解决单图片模式下出现报错问题 1 bulan lalu
include 3f876c7cf7 解决单图片模式下出现报错问题 1 bulan lalu
src 3f876c7cf7 解决单图片模式下出现报错问题 1 bulan lalu
CMakeLists.txt f48f622d58 添加项目 1 bulan lalu
README 3f876c7cf7 解决单图片模式下出现报错问题 1 bulan lalu
main.cpp 95b692ac32 可实现usb摄像头间隔10s、30s、60s采集图片并输出高度信息,但在单图片模式下会报错 Could not open camera 但不影响输出 1 bulan lalu
test.jpg f48f622d58 添加项目 1 bulan lalu
test2.jpg f48f622d58 添加项目 1 bulan lalu
test3.jpg f48f622d58 添加项目 1 bulan lalu
test4.jpg f48f622d58 添加项目 1 bulan lalu

README

使用方式:单图片模式:cd build ./ feed_level_detection ../test6.jpg
摄像头模式:cd build ./ fees_level_detection --camera 10
此模式下:10s 30s 60s 可选
实现目标:通过单目视觉测量饲料表面与图像顶部的垂直距离
实现思路:图像处理,边缘检测,表面定位(取最高点),计算距离,结果可视化
输入参数:图像
输出参数:可视化图像以及与图像顶部的距离(像素点),可根据实际距离计算转化比例输出实际高度
注意:不同图像因边缘梯度不同,需修改Canny检测的输入参数(可参考下述Canny边缘检测的理论解释进行调整)
高斯模糊去噪:G(x,y) = (1/(2πσ²)) * e^(-(x²+y²)/(2σ²))
选择高斯核大小:通常使用奇数尺寸的核(如3*3, 5*5等)
计算高斯权重:根据σ值计算核中每个位置的权重
归一化权重:使所有权重之和为1
卷积运算:将高斯核与图像进行卷积
对于轻度噪声:σ=0.5-1.5,核大小3*3或5*5
对于较强噪声:σ=1.5-3.0,核大小5*5或7*7
Canny边缘检测:一种经典的图像边缘提取算法
使用Sobel算子计算图像的梯度:
水平梯度Gx = Sobel_x * 图像
垂直梯度Gy = Sobel_y * 图像
梯度幅度:G = √(Gx² + Gy²)
梯度方向:θ = arctan(Gy/Gx),量化到0°、45°、90°、135°四个方向
双阈值检测:
设定高阈值(Thigh)和低阈值(Tlow),通常Tlow ≈ 0.4*Thigh
梯度值 > Thigh:强边缘像素
Tlow < 梯度值 ≤ Thigh:弱边缘像素
梯度值 ≤ Tlow:抑制
cv::findContours函数:OpenCV 中用于从二值图像中提取轮廓的函数,通常与边缘检测(如 Canny)或阈值处理的结果配合使用
输入参数:Canny函数的输出,mode 轮廓检索模式,method:轮廓近似方法
mode:轮廓检索模式
cv::RETR_EXTERNAL:只检测最外层轮廓
cv::RETR_LIST:检测所有轮廓,不建立层级关系
cv::RETR_CCOMP:检测所有轮廓,组织为两级层次结构
cv::RETR_TREE:检测所有轮廓,建立完整的层级树
method:轮廓近似方法
cv::CHAIN_APPROX_NONE:存储所有轮廓点
cv::CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留端点
cv::CHAIN_APPROX_TC89_L1 或 cv::CHAIN_APPROX_TC89_KCOS:使用 Teh-Chin 链逼近算法
输出参数:contours:检测到的轮廓,每个轮廓存储为点向量