# coding=utf-8
# 先读图,然后二值化,
# 矩形度,
import cv2
import math
import numpy as np
# 此处读入图片,作为接口
pic_name = 'picture/butterfly0.jpg'
origin = cv2.imread(pic_name)
grayimage = cv2.imread(pic_name, 0)
# species = 'wo'
# 高斯滤波
blur = cv2.GaussianBlur(grayimage, (5, 5), 0)
# 二值化:用大津法,此处选项若是THRESH_BINARY_INV,则同意选用白色背景的图片样本
ret, otsu = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 找轮廓
contours = cv2.findContours(otsu, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 轮廓集数目
largest_area = 0
largest_contour_index = 0
num = len(contours[1])
for i in range(num):
area = cv2.contourArea(contours[1][i], False)
if area > largest_area:
largest_area = area
largest_contour_index = i
maxContour = contours[1][largest_contour_index]
# 画轮廓
cv2.drawContours(origin, maxContour, -1, (0, 0, 255), 2)
print "最大面积" + str(largest_area)
# 矩形度*****************************************************
# 矩形度*****************************************************
# 矩形度*****************************************************
# 矩形度*****************************************************
# 查找最小外接矩形
minAreaRect = cv2.minAreaRect(maxContour)
box = cv2.boxPoints(minAreaRect)
box = np.int0(box)
# 画轮廓
cv2.drawContours(origin, [box], 0, (0, 255, 0), 2)
# 计算最小外接矩形面积
minAreaRect_Area = int(cv2.contourArea(box, False))
print "最小外接矩形面积" + str(minAreaRect_Area)
# 特征一:矩形度的计算
P_Rect = largest_area * 1.0 / minAreaRect_Area
# 统一结果为3位小数
P_Rect = round(P_Rect, 3)
print "矩形度" + str(P_Rect)
# 延长度***************************************************************************************************
# 延长度***************************************************************************************************
# 延长度***************************************************************************************************
# 延长度***************************************************************************************************
# 质心计算
M = cv2.moments(maxContour)
Centroid_x = int(M['m10'] / M['m00'])
Centroid_y = int(M['m01'] / M['m00'])
print "质心" + str(Centroid_x) + " " + str(Centroid_y)
cv2.circle(origin, (Centroid_x, Centroid_y), 3, (255, 255, 255), -1)
# 获取长轴
Major_Axis_Length = 0
Major_Axis_Angle = 0
Major_Axis_End_x = 0
Major_Axis_End_y = 0
Major_Axis_Begin_x = 0
Major_Axis_Begin_y = 0
# 此处需要注意质心是否在轮廓内
# 找长轴
for angle in range(180):
theta = angle * 3.14 / 180.0
lengthBackward = 0
lengthForward = 0
point_End_x = Centroid_x
point_End_y = Centroid_y
point_Begin_x = Centroid_x
point_Begin_y = Centroid_y
# 步进越小准确率越高,设置成1可以先找到准确的直线角度,再根据角度和质心得到的直线计算出正确的长轴和轮廓交点
while cv2.pointPolygonTest(maxContour, (point_End_x, point_End_y), False) > 0:
lengthForward = lengthForward + 0.1
point_End_x = int(round(point_End_x + lengthForward * math.cos(theta)))
point_End_y = int(round(point_End_y + lengthForward * math.sin(theta)))
while cv2.pointPolygonTest(maxContour, (point_Begin_x, point_Begin_y), False) > 0:
lengthBackward = lengthBackward + 0.1
point_Begin_x = int(round(point_Begin_x - lengthBackward * math.cos(theta)))
point_Begin_y = int(round(point_Begin_y - lengthBackward * math.sin(theta)))
if lengthForward + lengthBackward >= Major_Axis_Length:
Major_Axis_Length = lengthForward + lengthBackward
Major_Axis_Angle = angle
Major_Axis_End_x = point_End_x
Major_Axis_End_y = point_End_y
Major_Axis_Begin_x = point_Begin_x
Major_Axis_Begin_y = point_Begin_y
# 计算实际长轴长度
Real_Major_Axis_Length = math.sqrt(
math.pow((Major_Axis_End_x - Major_Axis_Begin_x), 2) + math.pow((Major_Axis_End_y - Major_Axis_Begin_y), 2))
Real_Major_Axis_Length = round(Real_Major_Axis_Length, 1)
print "长轴长度 = " + str(Real_Major_Axis_Length)
print "长轴角度 = " + str(Major_Axis_Angle)
# print "起点 = " + "x: " + str(Major_Axis_Begin_x) + " y: " + str(Major_Axis_Begin_y)
# print "起点 = " + "x: " + str(Major_Axis_End_x) + " y: " + str(Major_Axis_End_y)
# 画长轴
cv2.line(origin, (Major_Axis_Begin_x, Major_Axis_Begin_y), (Major_Axis_End_x, Major_Axis_End_y), (255, 0, 0), 2)
# 找短轴
# 1. 先得到长轴直线的表达式y=k*x+b,用来计算点到直线距离和判断点在直线上方还是下方
Major_Axis_k = math.tan(Major_Axis_Angle * 3.14 / 180.0)
Major_Axis_b = Centroid_y - Major_Axis_k * Centroid_x
# 2. 点(x0,y0)到直线(Ax+By+C=0)的距离为d =abs (A*x0+B*y0+C)/sqrt(A^2+B^2)
Minor_Axis_A = Major_Axis_k
Minor_Axis_B = -1
Minor_Axis_C = Major_Axis_b
# 3. 遍历轮廓上的点
Minor_Axis_Under_length = 0
Minor_Axis_Above_length = 0
Minor_Axis_Under_End_x = 0
Minor_Axis_Under_End_y = 0
Minor_Axis_Above_End_x = 0
Minor_Axis_Above_End_y = 0
# 轮廓点集
ContourItems = maxContour.shape[0]
for item in range(ContourItems):
point_x = maxContour[item][0][0]
point_y = maxContour[item][0][1]
# 判断点在直线哪一侧
# 上侧
if point_y > int(Major_Axis_k * point_x + Major_Axis_b):
# 点到直线距离
dis = abs((Minor_Axis_A * point_x + Minor_Axis_B * point_y + Minor_Axis_C) / math.sqrt(
Minor_Axis_A * Minor_Axis_A + Minor_Axis_B * Minor_Axis_B))
if dis >= Minor_Axis_Above_length:
Minor_Axis_Above_length = dis
Minor_Axis_Above_End_x = point_x
Minor_Axis_Above_End_y = point_y
# 下侧
elif point_y < int(Major_Axis_k * point_x + Major_Axis_b):
# 点到直线距离
dis = abs((Minor_Axis_A * point_x + Minor_Axis_B * point_y + Minor_Axis_C) / math.sqrt(
Minor_Axis_A * Minor_Axis_A + Minor_Axis_B * Minor_Axis_B))
if dis >= Minor_Axis_Under_length:
Minor_Axis_Under_length = dis
Minor_Axis_Under_End_x = point_x
Minor_Axis_Under_End_y = point_y
# 第三种可能就是轮廓与直线的交点
# # 标记两个点,可以忽略
cv2.circle(origin, (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y), 4, (255, 255, 255), -1)
cv2.circle(origin, (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y), 4, (255, 255, 255), -1)
# 画出两点直线
cv2.line(origin, (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y), (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y),
(0, 255, 255), 3)
# 计算实际短轴长度
Real_Minor_Axis_Length = math.sqrt(
math.pow((Minor_Axis_Above_End_x - Minor_Axis_Under_End_x), 2) + math.pow(
(Minor_Axis_Above_End_y - Minor_Axis_Under_End_y), 2))
Real_Minor_Axis_Length = round(Real_Minor_Axis_Length, 1)
print "短轴长度 = " + str(Real_Minor_Axis_Length)
# 特征二:延长度的计算
P_extend = Real_Major_Axis_Length * 1.0 / Real_Minor_Axis_Length
P_extend = round(P_extend, 3)
print "延长度 = " + str(P_extend)
# 画出与长轴距离最远的两点的辅助线,使用时可以不用,画图用作论文使用
# 画出长轴右方
line_above_k = math.tan((Major_Axis_Angle - 90) * 3.14 / 180.0)
line_above_b = Minor_Axis_Above_End_y - line_above_k * Minor_Axis_Above_End_x
Minor_Axis_Above_Begin_x = int((line_above_b - Major_Axis_b) / (Major_Axis_k - line_above_k))
Minor_Axis_Above_Begin_y = int(line_above_k * Minor_Axis_Above_Begin_x + line_above_b)
cv2.line(origin, (Minor_Axis_Above_Begin_x, Minor_Axis_Above_Begin_y), (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y),
(255, 0, 255), 3)
line_under_k = math.tan((Major_Axis_Angle - 90) * 3.14 / 180.0)
line_under_b = Minor_Axis_Under_End_y - line_under_k * Minor_Axis_Under_End_x
Minor_Axis_Under_Begin_x = int((line_under_b - Major_Axi
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于机器视觉实现昆虫识别计数系统python源码+数据集+模型+详细项目说明.zip 【项目任务】 图片中昆虫虫体计数 PyQt和OpenCV结合做出基本界面 摄像头Frame中检测虫体数目,并在界面中显示标出 学习昆虫图像特征的提取,参考论文中提出的几个特征量 提取特征量并进行保存 按照神经网络方法搭建训练模型 搭建了线性SVM分类训练器 将特征提取和UI界面建立连接,实现拍照和预测判断一体 【机器学习训练算法】
资源推荐
资源详情
资源评论
收起资源包目录
基于机器视觉实现昆虫识别计数系统python源码+数据集+模型+详细项目说明.zip (164个子文件)
data.csv 2KB
datatest.csv 826B
ques.csv 34B
.gitignore 1KB
Insect_Identification.iml 500B
fly16.jpg 993KB
fly15.jpg 943KB
fly2.jpg 880KB
fly17.jpg 857KB
fly11.jpg 818KB
fly1.jpg 782KB
fly12.jpg 782KB
fly14.jpg 631KB
fly13.jpg 525KB
fly5.jpg 442KB
tttresult.jpg 258KB
wo1.jpg 207KB
jingui5.jpg 152KB
zhang0.jpg 152KB
tttgray.jpg 146KB
wo2.jpg 113KB
wo7.jpg 103KB
fly7.jpg 102KB
fly6.jpg 101KB
testText.jpg 98KB
fly4.jpg 88KB
zhang1.jpg 87KB
jingui16.jpg 78KB
jingui6.jpg 78KB
wo6.jpg 73KB
wo0.jpg 71KB
wo3.jpg 71KB
test.jpg 67KB
fly8.jpg 65KB
ricetestnum.jpg 55KB
testresult.jpg 54KB
jingui4.jpg 51KB
jingui3.jpg 50KB
fly0gray.jpg 48KB
jingui14.jpg 46KB
zhang6.jpg 45KB
jingui1.jpg 44KB
wo4.jpg 41KB
zhizhu6.jpg 41KB
jingui7.jpg 40KB
butterfly0.jpg 40KB
test-冲突-MR。SHen.jpg 40KB
jingui2.jpg 38KB
jingui8.jpg 33KB
zhizhu7.jpg 31KB
ricetestgray.jpg 31KB
fly0.jpg 31KB
fly0.jpg 31KB
zhizhu11.jpg 30KB
fly3.jpg 30KB
fly1.jpg 27KB
zhang4.jpg 27KB
jingui12.jpg 26KB
zhang8.jpg 25KB
wo5.jpg 24KB
jingui13.jpg 23KB
fly2.jpg 23KB
zhizhu0gray.jpg 23KB
jingui11.jpg 22KB
fly9.jpg 22KB
zhang2.jpg 21KB
fly6.jpg 20KB
cangtest0gray.jpg 19KB
fly4.jpg 19KB
fly5.jpg 19KB
zhizhu8.jpg 19KB
fly3.jpg 19KB
zhang5.jpg 19KB
fly7.jpg 18KB
zhizhu5.jpg 18KB
cang0.jpg 18KB
fly0.jpg 18KB
zhizhu10.jpg 18KB
jingui15.jpg 17KB
zhang9.jpg 17KB
cang2.jpg 16KB
wo2.jpg 16KB
wo4.jpg 15KB
zhizhu9.jpg 15KB
cang4.jpg 15KB
zhizhu4.jpg 13KB
zhizhu0.jpg 13KB
zhang7.jpg 13KB
cang3.jpg 12KB
wo6.jpg 11KB
wo5.jpg 11KB
wo1.jpg 11KB
cang1.jpg 10KB
jingui0.jpg 10KB
wo0.jpg 8KB
wo3.jpg 8KB
wo7.jpg 7KB
zhang3.jpg 7KB
zhizhu2.jpg 5KB
zhizhu3.jpg 5KB
共 164 条
- 1
- 2
Make程序设计
- 粉丝: 6493
- 资源: 3571
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页