文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
项目简介 |
实习方法 |
源码分享 |
项目简介:
利用python自带的opencv库来计算植物叶片的叶面积、叶直径和叶周长,拍摄图片就可以直接得到真实的叶面积、叶直径和叶周长。
实现方法:
首先,我们需要这样拍摄一张植物的图片,需要一个黑色的底板,一张A4纸,拍摄时需要将植物叶面放平,A4纸的四个直角都需要拍摄进照片中,确保A4纸与底下的黑色卡纸在照片边上有黑边(既是为了方便拍摄,也是为了方便计算):
然后我们的步骤是:
找出照片中的最大轮廓(此时理所当然是我们的A4纸)→进行图像的矫正透视变换将照片的黑边去掉
如何一步到位拿到真实值?
我们知道要想得到真实的叶面积、叶直径和叶周长,需要一些已知长度的东西来作为比例对照物,这里我选择用A4纸来作为现实比例对照物,通过
公式(1):测得植物像素值/植物真实值=测得A4纸像素值/A4真实值
这里面的“测得植物像素值”“测得A4纸像素值”和“A4真实值”我们都知道,那么就可以计算植物真实值。
如何得到植物的真实叶面积?
去黑边照片→找到最大轮廓(理所当然是植物轮廓)→得到轮廓的像素面积→公式(1)计算
如何得到植物的真实叶直径?
去黑边照片→找到最大轮廓(理所当然是植物轮廓)→对该轮廓画圆→得到圆的直径(直径即为植物叶直径)→公式(1)计算
如何得到植物的真实叶周长?
去黑边照片→找到最大轮廓(理所当然是植物轮廓)→得到该轮廓周长(该轮廓周长即为植物叶周长)→公式(1)计算
源码分享:
img1为带黑边的原始图像,warp_imgs为图像矫正透视变换后的去黑边图像,其余py文件分享在下面,计算周长的代码自行去获取轮廓周长套公式(1)进行计算:
get_area_final.py:
import cv2
import numpy as np
def sort_contours_size(cnts):
"""根据大小对轮廓进行排序"""
cnts_sizes = []
for contour in cnts:
cnt_size = cv2.contourArea(contour)
cnts_sizes.append([cnt_size,contour])
cnts_sizes.sort(key=lambda x:x[0], reverse=True)
return cnts_sizes
def get_area_main(path):
img = cv2.imread(path)
#变成单通道的黑白图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化 返回阈值和二值化后图
thresh,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
# cv2.imshow("img1",binary)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# 查找轮廓 返回轮廓和层级
contours, hierarchy = cv2.findContours(binary.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓会直接修改原图
img_copy = img.copy()
cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 2)
# cv2.imshow('img_con', img_copy)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
contour_sizes = sort_contours_size(contours)
cnt = contour_sizes[1][1]
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
# print(center,radius)
cv2.circle(img_copy, center, radius, (255, 0, 0), 2)
# cv2.imshow('img_con2', img_copy)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
p_zhi = contour_sizes[0][0]
p_ye = contour_sizes[1][0]
# print(p_zhi,p_ye)
s_zhi = 623.7 # 纸29.7 21
s_ye = (p_ye * s_zhi) / p_zhi
zhi_chang_jia=img.shape[0]
zhi_changzheng=29.7
ye_long_zheng=(zhi_changzheng*2*radius)/zhi_chang_jia
return s_ye,ye_long_zheng
# path="warp_imgs/warp3.jpg"
# img = cv2.imread(path)
# print(img.shape[0])
get_warp_img_final.py:
import cv2
import numpy as np
minArea = 1000
filter = 4
scale = 2
wp = 210 * scale
hp = 297 * scale
def getContours(img):
imgG = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgG,(5,5),1)
imgCanny = cv2.Canny(imgBlur,100,100)
kernel = np.ones((5,5))
imgDial = cv2.dilate(imgCanny,kernel,iterations=3)
imgThre = cv2.erode(imgDial,kernel,iterations=2)
# cv2.imshow('res',imgCanny)
# cv2.imshow('res2',imgThre)
contours, hiearchy = cv2.findContours(imgThre,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
finalCountours = []
for i in contours:
area = cv2.contourArea(i)
if area> minArea:
# 计算轮廓的周长,true表示轮廓为封闭
peri = cv2.arcLength(i,True)
#进行轮廓的多边拟合
appprox = cv2.approxPolyDP(i,0.02*peri,True)
bbox = cv2.boundingRect(appprox)
if filter > 0 :
if(len(appprox))==filter:
finalCountours.append([len(appprox),area,appprox,bbox,i,peri])
else:
finalCountours.append([len(appprox), area, appprox, bbox, i,peri])
# 对第二个数值面积进行排序,为升序,找出轮廓的最大值
finalCountours = sorted(finalCountours, key=lambda x: x[1], reverse=True)
for con in finalCountours:
cv2.drawContours(img,con[4],-1, (0, 0, 255), 4)
return img,finalCountours
def reorder(myPoints):
#print(myPoints.shape)
myPointsNew = np.zeros_like(myPoints)
myPoints = myPoints.reshape((4,2))
add = myPoints.sum(1)
myPointsNew[0] = myPoints[np.argmin(add)]
myPointsNew[3] = myPoints[np.argmax(add)]
diff = np.diff(myPoints,axis=1)
myPointsNew[1]= myPoints[np.argmin(diff)]
myPointsNew[2] = myPoints[np.argmax(diff)]
# print(myPoints)
### 最后
> **🍅 硬核资料**:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**