前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
本次分享的课题是
🎯opencv机器学习精度测量系统
课题背景和意义
图像测量技术作为一种新兴的非接触测量技术,突破了人为接触式测量的限制,实现了工业产品质量的自动检测,解决了人工检测工作量繁重和成本高等问题,具有广阔发展前景。
随着制造技术和测量技术要求的不断提高,视觉测量技术的高精度化、高速化及高效率化成为图像测量技术的重要发展方向。测量条件不变的情况下,提高图像质量能直接提高测量精度,而影响图像采集质量的因素有很多,如传感器的性能(分辨率)、镜头的畸变程度和环境光源的选择等。通常情况下,测量精度主要取决于相机分辨率,但高分辨率相机价格昂贵,所以在硬件成本固定的情况下,从图像处理的角度进一步提高测量精度具有重要研究意义。
实现技术思路
用相似三角形计算物体或者目标到相机的距离
相似三角形就是这么一回事:假设我们有一个宽度为 W 的目标或者物体。然后我们将这个目标放在距离我们的相机为 D 的位置。我们用相机对物体进行拍照并且测量物体的像素宽度 P 。这样我们就得出了相机焦距的公式:
F = (P x D) / W
举个例子,假设我在离相机距离 D = 24 英寸的地方放一张标准的 8.5 x 11 英寸的 A4 纸(横着放;W = 11)并且拍下一张照片。我测量出照片中 A4 纸的像素宽度为 P = 249 像素。
因此我的焦距 F 是:
F = (248px x 24in) / 11in = 543.45
当我继续将我的相机移动靠近或者离远物体或者目标时,我可以用相似三角形来计算出物体离相机的距离:
D’ = (W x F) / P
为了更具体,我们再举个例子,假设我将相机移到距离目标 3 英尺(或者说 36 英寸)的地方并且拍下上述的 A4 纸。通过自动的图形处理我可以获得图片中 A4 纸的像素距离为 170 像素。将这个代入公式得:
D’ = (11in x 543.45) / 170 = 35 英寸
或者约 36 英寸,合 3 英尺。
测量相机到目标的距离
# import the necessary packages
import numpy as np
import cv2
def find_marker(image):
# convert the image to grayscale, blur it, and detect edges
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)
# find the contours in the edged image and keep the largest one;
# we’ll assume that this is our piece of paper in the image
(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = max(cnts, key = cv2.contourArea)
# compute the bounding box of the of the paper region and return it
return cv2.minAreaRect(c)
第一件要做的事情就是导入必要的包。我们将用 NumPy
来进行数值计算和 cv2
来绑定 OpenCV 。
在那之后我们定义 find_marker
函数。这个函数接收一个 image
参数,并且这意味着我们将用它来找出将要计算距离的物体。
简单的边缘检测和计算最大的轮廓是可行的。我们可以通过使用轮廓近似法使系统更具鲁棒性,排除不包含有4个顶点的轮廓,然后计算面积最大的四点轮廓。
#import the necessary packages
import numpy as np
import cv2
def find_marker(image):
# convert the image to grayscale, blur it, and detect edges
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)
# find the contours in the edged image and keep the largest one;
# we’ll assume that this is our piece of paper in the image
(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = max(cnts, key = cv2.contourArea)
# compute the bounding box of the of the paper region and return it
return cv2.minAreaRect(c)
def distance_to_camera(knownWidth, focalLength, perWidth):
# compute and return the distance from the maker to the camera
return (knownWidth * focalLength) / perWidth
# initialize the known distance from the camera to the object, which
# in this case is 24 inches
KNOWN_DISTANCE = 24.0
# initialize the known object width, which in this case, the piece of
# paper is 11 inches wide
KNOWN_WIDTH = 11.0
# initialize the list of images that we’ll be using
IMAGE_PATHS = [“images/2ft.png”, “images/3ft.png”, “images/4ft.png”]
# load the furst image that contains an object that is KNOWN TO BE 2 feet
# from our camera, then find the paper marker in the image, and initialize
# the focal length
image = cv2.imread(IMAGE_PATHS[0])
marker = find_marker(image)
focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH
实现效果图样例
三角形相似法,并且需要知道两个重要的参数:
1、 目标的实际宽度(或高度),单位可以是英寸或者米。
2、 标定过程 1 中相机到目标的距离。
计算机视觉和图像处理算法可以被用来自动检测图像中物体的像素宽度或高度并且完成相似三角形的计算,得出一个焦距。
然后在接下来的图片中,我们只要提取出目标轮廓就可以利用得到的焦距测量出目标到相机的距离。
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!