滑动验证码-获取滑动长度
思路:
-
为了更快精准的找出滑动的距离,因此可以给图片做适当的处理
- 灰度化。所谓灰度,就是图像没有色彩。举个例子,原本的彩色图片是有RGB三种颜色组成的(也就是每个像素点由三个值),现在给图像灰度化,每个像素点只有一个值(0-255)表示颜色的深度
-
为了方便测试,可以考虑使用python的实时图像框架调试
安装
pip install opencv-python==4.6.0.66
pip install streamlit==1.11.1
运行streamlit代码
streamlit run file_path
翻译
如果您是我们的开发合作伙伴之一,或者您有兴趣获得
个人技术支持或Streamlit更新,请输入您的电子邮件
地址如下。否则,您可以将该字段留空。
图片比对相似
cv2.matchTemplate(big, small, cv2.TM_CCORR_NORMED)
-
方差匹配方法(TM_SQDIFF):匹配度越高,值越接近于0
-
归一化方差匹配方法(TM_SQDIFF_NORMED):完全匹配结果为0
-
相关性匹配方法(TM_CCORR):完全匹配会得到很大值,不匹配会得到一个很小值或0
-
归一化的互相关匹配方法(TM_CCORR_NORMED):完全匹配会得到1, 完全不匹配会得到0
-
相关系数匹配方法(TM_CCOEFF):完全匹配会得到一个很大值,完全不匹配会得到0,完全负相关会得到很大的负数
- 此处与书籍以及大部分分享的资料所认为不同,研究公式发现,只有归一化的相关系数才会有[-1,1]的值域
-
归一化的相关系数匹配方法( TM_CCOEFF_NORMED):完全匹配会得到1,完全负相关匹配会得到-1,完全不匹配会得到0
-
# pip install opencv-python # pip install streamlit import cv2 import streamlit as st def get_long(): # 导入图片 img1 = cv2.imread('./imgs/cpt1.png') img2 = cv2.imread('./imgs/cpt2.png') # 建立2个 st 控制的变量 min_value = st.slider('input min value',max_value=500) max_value = st.slider('input max value',max_value=1000) # 边缘化图片 # Canny使用的滞后阈值,低阈值,高阈值 # canny1 = cv2.Canny(img1,min_value,max_value) ''' 1. Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值)。 2. 如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。 3. 如果某一像素位置的幅值小于 低 阈值, 该像素被排除。 4. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于 高 阈值的像素时被保留。 ''' canny1 = cv2.Canny(img1,min_value,max_value) # 保存图片 cv2.imwrite('./imgs/tcpt1.png',canny1) # 使用 streamlit 输出结果 st.write(canny1) st.image(canny1) canny2 = cv2.Canny(img2,min_value,min_value) cv2.imwrite('./imgs/tcpt2.png',canny2) st.image(canny2) # 加载边缘化后的图片 big = cv2.imread('./imgs/tcpt1.png') small = cv2.imread('./imgs/tcpt2.png') # 对比图片 rs = cv2.matchTemplate(big, small, cv2.TM_CCORR_NORMED) # 通过制定的方法来查询相应的结果 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(rs) # st.write(rs) # st.write(min_val, max_val, min_loc, max_loc) # st.write(big.shape) return max_loc[0]/big.shape[1]*340 # 画图个框来验证,匹配的结果是否正确 # tw,th = small.shape[:2] # timg = cv2.rectangle(big, max_loc, (max_loc[0]+tw,max_loc[1]+th), (255,255,0)) # st.image(timg) if __name__ == '__main__': get_long()