图片1:
需求说明:
1.不使用深度学习,机器学习之类的算法,就使用python+opencv
2.从图片1中识别出图片2中用红色框圈出的两个零部件;
3.判断两个零部件是否位置对齐(如图1中所处位置)。
为了实现从图片1中识别出图片2中用红色框圈出的两个零部件,并判断它们是否位置对齐,可以使用以下代码作为参考:
import cv2
import numpy as np
def detect_and_match_parts(image1, image2, template1, template2):
# 读取图像和模板
img1 = cv2.imread(image1)
img2 = cv2.imread(image2)
temp1 = cv2.imread(template1, 0)
temp2 = cv2.imread(template2, 0)
# 使用模板匹配方法进行目标识别
res1 = cv2.matchTemplate(img1, temp1, cv2.TM_CCOEFF_NORMED)
res2 = cv2.matchTemplate(img2, temp2, cv2.TM_CCOEFF_NORMED)
# 设置匹配结果的阈值
threshold = 0.8
# 获取匹配结果中符合阈值的位置
loc1 = np.where(res1 >= threshold)
loc2 = np.where(res2 >= threshold)
# 检查两个零部件是否位置对齐
aligned = False
for pt1 in zip(*loc1[::-1]):
for pt2 in zip(*loc2[::-1]):
# 计算两个零部件的位置差
dx = pt2[0] - pt1[0]
dy = pt2[1] - pt1[1]
# 如果位置差小于一定阈值,则判定为位置对齐
if abs(dx) < 10 and abs(dy) < 10:
aligned = True
# 在图像上绘制矩形框标记零部件
cv2.rectangle(img1, pt1, (pt1[0] + temp1.shape[1], pt1[1] + temp1.shape[0]), (0, 0, 255), 2)
cv2.rectangle(img2, pt2, (pt2[0] + temp2.shape[1], pt2[1] + temp2.shape[0]), (0, 0, 255), 2)
break
# 显示结果图像
cv2.imshow("Image 1", img1)
cv2.imshow("Image 2", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
return aligned
# 调用函数进行目标识别和位置对齐判断
aligned = detect_and_match_parts("image1.jpg", "image2.jpg", "template1.jpg", "template2.jpg")
if aligned:
print("两个零部件位置对齐")
else:
print("两个零部件未位置对齐")
请确保将image1.jpg、image2.jpg、template1.jpg和template2.jpg替换为实际的文件路径,这些文件包括了图片1、图片2以及红色框圈出的两个零部件的模板图像。
该代码会在图片1和图片2中进行模板匹配,找到与模板1和模板2匹配的位置。然后,通过计算两个零部件的位置差,判断它们是否位置对齐。如果位置差较小,则在图片1和图片2上绘制矩形框标记零部件。
最后,通过调用cv2.imshow显示结果图像,并根据位置对齐的结果输出相应的信息。
这个问题单纯使用openCV的话,可能效果不是很好。
推荐先用yolo训练一个目标识别的模型。然后在收集数据集做一个二分类。
当然,这样效果虽然好一些。但是工作量会大很多。
如果你单纯想要这两张图片合适的话,那上面那楼的代码应该可以直接使用。
将棋盘图用A4纸打印,并将将A4纸贴到一个很平的板子上固定好
例子如下:
有钱的大佬,可以直接买标定板。
注意,如果是打印的棋盘格一定要贴平,不然标定不准确
需要针对你的使用场景进行训练,没有通用的代码的
以下是识别差异的代码
#!/user/bin/env python3
# -*- coding: utf-8 -*-
import cv2
# 深度学习-图像识别
def getContuors(img):
contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
# print(area)
if area > 500:
cv2.drawContours(imgContour, cnt, -1, (0, 0, 0), 1)
peri = cv2.arcLength(cnt, True) # 轮廓长度
approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
objCor = len(approx)
# print(objCor)
x, y, w, h = cv2.boundingRect(approx)
if objCor == 3:
objectType = 'Tri'
elif objCor == 4:
aspRatio = w / float(h)
# print(aspRatio)
if aspRatio > 0.95 and aspRatio < 1.05:
objectType = 'ZFX'
else:
objectType = 'CFX'
elif objCor > 4:
objectType = 'YX'
else:
objectType = 'NONE'
cv2.rectangle(imgContour, (x, y), (x + w, y + h), (255, 0, 0), 1)
cv2.putText(imgContour, objectType, (x + (w // 2) - 10, y + (h // 5) - 10), cv2.FONT_HERSHEY_COMPLEX, 0.5,
(0, 0, 0), 2)
img = cv2.imread('ss.png')
imgsize = cv2.resize(img, (500, 400)) # 裁剪后
imgContour = imgsize.copy()
imgGRAY = cv2.cvtColor(imgsize, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGRAY, (7, 7), 1) # 模糊度
imgCann = cv2.Canny(imgBlur, 50, 50)
getContuors(imgCann)
if __name__ == '__main__':
cv2.imshow('windows', imgCann)
cv2.imshow('window', imgContour)
cv2.waitKey(0)
这个 可以用华为云的ModelArts 来搞一下, 你去看下, 如有帮助给个采纳谢谢
针对您的需求,您可以使用Python和OpenCV库进行目标识别和位置对齐判断。以下是简单的步骤说明:
目标识别:
使用OpenCV的模板匹配方法来识别图片1中与图片2中红色框圈出的两个零件相似的部分。首先,将图片2中的红色框框出的区域作为模板图像。
在图片1中使用模板匹配方法,找到与模板最匹配的位置信息。
这里给出一个示例代码片段:
python
import cv2
# 加载图像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)
# 执行模板匹配
match_result = cv2.matchTemplate(img1, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(match_result)
# 提取位置信息
top_left = max_loc
bottom_right = (top_left[0] + template.shape[1], top_left[1] + template.shape[0])
# 在原图上绘制矩形框
img_result = cv2.imread('image1.jpg')
cv2.rectangle(img_result, top_left, bottom_right, (0, 0, 255), 2)
# 显示结果
cv2.imshow('Result', img_result)
cv2.waitKey(0)
位置对齐判断:
通过比较两个零件在图片1中的位置信息,判断它们是否位置对齐。可以计算两个零件的相对位置差异,例如计算它们的横向和纵向距离,然后设定一个阈值来判断是否对齐。
这里给出一个位置对齐判断的示例代码:
python
x_diff = abs(top_left_1[0] - top_left_2[0])
y_diff = abs(top_left_1[1] - top_left_2[1])
if x_diff < threshold and y_diff < threshold:
print("两个零部件位置对齐")
else:
print("两个零部件位置不对齐")
你需要先确定你的对齐标准是什么,如水平对齐、垂直对齐、角度对齐等,还有模糊匹配的话的确如果图片有太多的噪声、模糊、变形、遮挡等,可能会影响匹配的效果和准确度,误差肯定是有的,你可以使用特征点检测和匹配的方法来识别和对齐目标,如SIFT、SURF、ORB等,或者使用机器学习或深度学习的方法来识别和对齐目标,如SVM、CNN、YOLO等
我们可以使用 OpenCV 的 cv2.CascadeClassifier 分类器来检测人脸、眼睛等特征。由于红色框的大小和位置是固定的,我们可以使用一个预定义的矩形来检测这两个零部件。
其次可以使用np.allclose() 函数用于比较两个图像是否相似。如果两个图像的像素值非常接近,则返回 True,否则返回 False。如果两个零部件的像素值非常接近,则认为它们位置对齐。
import cv2
# 加载两张图片
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
# 将图片转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 使用阈值化功能将灰度图像转换为二值图像
ret, thresh1 = cv2.threshold(gray1, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh2 = cv2.threshold(gray2, 127, 255, cv2.THRESH_BINARY_INV)
# 使用边缘检测功能检测目标零部件的边缘
edges1 = cv2.Canny(thresh1, 100, 200)
edges2 = cv2.Canny(thresh2, 100, 200)
# 使用霍夫变换或其他方法识别目标零部件的形状
# ...
# 使用平移、旋转和缩放功能调整目标零部件的位置
# ...
# 使用绘图功能将处理后的图像输出
cv2.imshow('result', img1)
cv2.imshow('result2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()