代码实现的前提

在上周的报告中说道,在目前的施工环境下,混凝土坍落扩展度是在一个固定尺寸测量盘上完成的。由于测量盘的真实尺寸是为我们所知的,同时测量盘具有比较独特的金属色泽,因此从图像识别的角度,测量盘是一个比较好的参考物。这将为我们的图像中物体的尺寸识别提供可能。

也就是说,为了确定图像中物体的大小,我们需要有一个参照物,这个参照物应该具有下述两种性质:

1.这个参照物的真实尺寸是为我们所知的。

2.这个参照物能被较容易的找到。

混凝土测量盘就非常符合这两个条件!

测试图像说明

由于目前暂无途径接触到实际的混凝土坍落拓展度测量过程,因此用家里的简易道具进行模拟,如下图所示。

其中铁盆模拟测量板,直径经测量为26cm,测试中将其直径设置为260cm;中间海绵模拟混凝土,长宽经测量后为12.7cm×9.0cm,测试中设置为127cm×90cm。

`

代码介绍

# 插入包
from scipy.spatial import distance as dist
from imutils import perspective
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2

首先插入程序所需要的包

def midpoint(ptA, ptB):return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)

定义一个函数,用来找中点。

# 设置arg,方便调试
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to the input image")
ap.add_argument("-w", "--width", type=float, required=True,help="width of the left-most object in the image (in inches)")
args = vars(ap.parse_args())

这里是为了程序调试方便,直接在终端输入相关命令即可调试

# 加载图像,转化灰度,同时用高斯过滤器过滤噪声
image = cv2.imread(args["image"])
image = cv2.resize(image,(0,0),fx=0.1,fy=0.1)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7, 7), 0)

读取图像,并将图像进行缩放,将图像转化为灰度图,再用高斯过滤器对图像进行过滤,滤去噪音。处理后的图像如下:

# 利用canny功能对边缘进行识别,同时利用腐蚀和膨胀功能对图像进行形态处理
edged = cv2.Canny(gray, 50, 100)
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)

这里是对图像进行形态处理,包括利用canny功能对边缘进行识别,同时利用腐蚀和膨胀功能进一步边界进行处理。处理后图像如下:

# 对轮廓点进行寻找
cnts = cv2.findContours(edged.copy(), cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[1] if imutils.is_cv3() else cnts[0]
pixelsPerMetric = None

这里对轮廓点进行寻找,RETR_TREE是返回所有轮廓,CHAIN_APPROX_SIMPLE是压缩长、宽和对角线方向的点,最终只返回四个点。
该段代码最后一句对pixelsPerMetric进行了定义。
结果如图所示:

for c in cnts:# 过滤过小的区域,过滤噪声if cv2.contourArea(c) < 1000:continue# 给轮廓加上外框orig = image.copy()box = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)box = np.array(box, dtype="int")# 旋转外框,使之契合实际物体box = perspective.order_points(box)cv2.drawContours(orig, [box.astype("int")], 0, (0, 255, 0), 2)for (x, y) in box:cv2.circle(orig, (int(x), int(y)), 5, (0, 0, 255), -1)# 找中点(tl, tr, br, bl) = box(tltrX, tltrY) = midpoint(tl, tr)(blbrX, blbrY) = midpoint(bl, br)# 找中点的中点(tlblX, tlblY) = midpoint(tl, bl)(trbrX, trbrY) = midpoint(tr, br)# 把中点在图像中画出来并连接cv2.circle(orig, (int(tltrX), int(tltrY)), 5, (255, 0, 0), -1)cv2.circle(orig, (int(blbrX), int(blbrY)), 5, (255, 0, 0), -1)cv2.circle(orig, (int(tlblX), int(tlblY)), 5, (255, 0, 0), -1)cv2.circle(orig, (int(trbrX), int(trbrY)), 5, (255, 0, 0), -1)cv2.line(orig, (int(tltrX), int(tltrY)), (int(blbrX), int(blbrY)),(255, 0, 255), 2)cv2.line(orig, (int(tlblX), int(tlblY)), (int(trbrX), int(trbrY)),(255, 0, 255), 2)

由上图可知,找到的轮廓中有许多噪声,影响结果的输出,因此我们可以利用contourArea函数计算轮廓区域面积,对过小的进行过滤。
之后利用Box函数给轮廓套矩形,并旋转矩形使得它能以最小的面积贴合轮廓,从而与实际相符。同时,我们还将把矩形的中点画出来,并进行连接。

# 计算中点间的欧几里得距离dA = dist.euclidean((tltrX, tltrY), (blbrX, blbrY))dB = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))# 如果pixelsPerMetric没有被定义,则将固定值赋给dB,这样就确定了每个像素在现实中对应的实际距离if pixelsPerMetric is None:pixelsPerMetric = dB / args["width"]# 识别物体尺寸dimA = dA / pixelsPerMetricdimB = dB / pixelsPerMetric# 将物体尺寸标在图像中cv2.putText(orig, "{:.1f}cm".format(dimA),(int(tltrX - 15), int(tltrY - 10)), cv2.FONT_HERSHEY_SIMPLEX,0.65, (255, 255, 255), 2)cv2.putText(orig, "{:.1f}cm".format(dimB),(int(trbrX + 10), int(trbrY)), cv2.FONT_HERSHEY_SIMPLEX,0.65, (255, 255, 255), 2)# 显示图像cv2.imshow("Image", res)cv2.waitKey(0)# 寻找海绵的尺寸if a > dimA:a = dimAif b > dimB:b = dimB

我们先利用euclidean方法测出中点中的欧几里得距离,此时再判断pixelsPerMetric,如果没有被定义,则将固定值赋给dB(由于轮廓默认排序中最外围的是第一个,所以固定值肯定是赋予铁盆的直径)。这样我们就得到了每个像素所对应的实际距离,并可据此对物体尺寸进行识别。结果如下:

结果显示,海绵的尺寸为126.6×89.8,与原尺寸127×90相比,误差在5mm以内,属于可以接受的范围。
同时我们也可以看到,虽然滤去了部分噪声,由于拍摄时的光影问题,程序可能会错误地识别一些轮廓,而为了解决这个问题。可以寻找这些数据中的最小值,即对应海绵的尺寸。最终返回值如下:

图像尺寸识别代码介绍相关推荐

  1. php iphone壁纸,iphone 壁纸尺寸 PHP 图像尺寸调整代码

    复制代码 代码如下: /********************** *@filename - path to the image *@tmpname - temporary path to thum ...

  2. php iphone壁纸,iphone壁纸尺寸PHP图像尺寸调整代码

    代码如下: /********************** *@filename - path to the image *@tmpname - temporary path to thumbnail ...

  3. ffmpeg 缩放算法_图像尺寸调整算法介绍并手动实现近邻算法

    课程更新完毕,后面会根据同学的意见维护此课程 课程讲师:[夏曹俊] 课程基于opencv**版3.2讲解,全部使用**的c++接口,旧的接口会逐步被opencv抛弃,所以我们学习还是尽量学习新的接口, ...

  4. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )

    文章目录 一.解码图片参数 inJustDecodeBounds 二.计算图片的缩小比例 三.设置图片缩小配置 inSampleSize 四.设置图片像素格式 inPreferredConfig 五. ...

  5. Faster-RCNN实现遥感图像滑坡识别

    目录 Faster-RCNN实现遥感图像滑坡识别 操作指南 对数据进行测试 数据集进行训练 数据集 自己制作数据集 Faster-RCNN实现遥感图像滑坡识别 代码链接:github代码 本代码参考g ...

  6. 基于Python实现的图像文字识别OCR工具,包含GUI界面附完整版代码可直接运行

    引言 最近在技术交流群里聊到一个关于图像文字识别的需求,在工作.生活中常常会用到,比如票据.漫画.扫描件.照片的文本提取. 博主基于 PyQt + labelme + PaddleOCR 写了一个桌面 ...

  7. insightface人脸识别代码记录(一)(数据前期准备)

    一.前言 这部分主要讲训练数据的制作.一是我们直接采用作者提供好的数据集,二就是制作我们自己所需要的数据集. 目录地址:insightface人脸识别代码记录(总)(基于MXNet) 二.主要内容 1 ...

  8. CNN网络实现手写数字(MNIST)识别 代码分析

    CNN网络实现手写数字(MNIST)识别 代码分析(自学用) Github代码源文件 本文是学习了使用Pytorch框架的CNN网络实现手写数字(MNIST)识别 #导入需要的包 import num ...

  9. 图像验证码识别(七)——字符分割

    2019独角兽企业重金招聘Python工程师标准>>> 前面经过各种去除噪点.干扰线,验证码图片现在已经只有两个部分,如果pixel为白就是背景,如果pixel为黑就为字符.正如前面 ...

最新文章

  1. linux上安装redis
  2. Docker安装(CentOS7环境)
  3. VMware安装以及安装Window7教程
  4. 不要重新发明轮子_是否重新发明轮子
  5. 【原创】大公司为什么还在采用过时的技术
  6. python中读取txt文件、统计其中所有字母出现的频度_Python编程小技巧:如何统计序列中元素的出现频度...
  7. 第一个程序03 - 零基础入门学习汇编语言22
  8. blender使用_用Blender教青少年3D动画
  9. 【图解】虚拟机下载安装以及Linux操作系统的配置CentOS安装
  10. 盘点 6 个开源的音乐播放器!
  11. java 订单支付宝_Java支付宝订单查询
  12. 演讲发言时太紧张怎么办?只需三招帮你彻底克服当众讲话前的紧张感
  13. ubuntu由于安装搜狗拼音导致的黑屏(或屏幕显示异常)
  14. 怎么样才能在服务器显示皮肤,服务器怎么使用皮肤
  15. 玩转容器安全二 - 容器安全概述
  16. 理清offsetparent()、offsetLeft/offsetTop、offset()、position()
  17. 北京电台“广播三下乡” 徐德亮演唱传统曲艺
  18. c语言关键字中英翻译机课程设计,课程设计--C语言关键字中英翻译机.doc
  19. 图书馆管理系统(C、数据结构、哈希表、文件IO)
  20. gocad2017 安装出现 error -103,577

热门文章

  1. NOI数学:二次同余方程的解法
  2. 二维数组和指针之间的关系详解
  3. 头肩底形态什么意思?萌新入市必看,教你快速理解头肩底形态
  4. Android汉字转拼音的完美解决方案
  5. 约翰·克利斯朵夫(三)
  6. ISO20000和ITSS认证有什么区别
  7. 按键精灵的IsFileExit和ExistFile函数
  8. 感觉还有用,骚年,当你还很弱的时候,此时应该专心练剑。临渊羡鱼,不如退而结网。
  9. 代码中的魔鬼数字 - -
  10. tf.keras.activation.selu()