python opencv 目标识别 计算机视觉

图片1:

img


图片2:

img

需求说明:
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训练一个目标识别的模型。然后在收集数据集做一个二分类。
当然,这样效果虽然好一些。但是工作量会大很多。
如果你单纯想要这两张图片合适的话,那上面那楼的代码应该可以直接使用。

需要针对你的使用场景进行训练,没有通用的代码的

以下是识别差异的代码


 
#!/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()

Python计算机视觉——OpenCV
写的非常详细,可以参考下