一、canny算子滤波求边缘
https://blog.csdn.net/MoreWindows/article/details/8239625
void cvCanny(
const CvArr* image,
CvArr* edges,
double threshold1,double threshold2,
int aperture_size=3
);
函数说明:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。
二、提取轮廓
用到的函数 cv2里面的cv2.findcontours
第四个参数:int型的mode,定义轮廓的检索模式:
取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
第五个参数:int型的method,定义轮廓的近似方法:
取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内
取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours
向量内,拐点与拐点之间直线段上的信息点不予保留
取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近
似算法
遇到错误:ValueError: not enough values to unpack (expected 3, got 2)
参考网站:https://blog.csdn.net/miao0967020148/article/details/88623631
解决办法:
OpenCV旧版,返回三个参数:
im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
要想返回三个参数:
把OpenCV 降级成3.4.3.18 就可以了,在终端输入pip install opencv-python==3.4.3.18
OpenCV 新版调用,返回两个参数:
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
三、提取圆心
这里用到这个函数cv2.minEnclosingCircle(cnt)
检查方法:圆心画图画到图上检查。
参考网站:https://www.cnblogs.com/skyfsm/p/6897313.html
circle—画圆形
函数原型:circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
img:在img上绘图;
center:圆心;例如:(0,0)
radius:半径;例如:20
color:线的颜色;例如:(0,255,0)(绿色)
thickness:线的粗细程度,例如:-1,1,2,3…
其它参数默认即可。
四、debug代码
1.细胞消失的情况:
这一段要改:不是删除轨迹,而是增加轨迹。
if len(del_tracks) > 0: # only when skipped frame exceeds max
for id in del_tracks:
if id < len(self.tracks):
del self.tracks[id]
del assignment[id]
else:
dprint("ERROR: id is greater than length of tracks")
网友评论