opencv demo

w e65634ddd5 可显示灰度图 以及边界 před 11 měsíci
include 3f876c7cf7 解决单图片模式下出现报错问题 před 11 měsíci
src e65634ddd5 可显示灰度图 以及边界 před 11 měsíci
CMakeLists.txt f48f622d58 添加项目 před 11 měsíci
README 3f876c7cf7 解决单图片模式下出现报错问题 před 11 měsíci
main.cpp 95b692ac32 可实现usb摄像头间隔10s、30s、60s采集图片并输出高度信息,但在单图片模式下会报错 Could not open camera 但不影响输出 před 11 měsíci
test.jpg f48f622d58 添加项目 před 11 měsíci
test2.jpg f48f622d58 添加项目 před 11 měsíci
test3.jpg f48f622d58 添加项目 před 11 měsíci
test4.jpg f48f622d58 添加项目 před 11 měsíci
test6.jpg 9d2bff611c 上传文件至 '' před 11 měsíci

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:检测到的轮廓,每个轮廓存储为点向量