主要思想是两张图相减,相同的部分会变为0,即图像为黑色。


PlanA
-
- import matplotlib.image as pltimg
- import matplotlib.pyplot as plt
-
- image = pltimg.imread("./flower.jpg", 1)
- image_01 = image.copy()
- sub_image = image - image_01
- plt.imshow(sub_image)
- plt.show()
- # plt.waitforbuttonpress(0)
PlanB
- image = cv2.imread("./flower.jpg", 1)
- img = image.copy()
- result = cv2.subtract(image, img)
- cv2.imshow("res", result)
- cv2.waitKey()
PlanC
-
- import cv2
- import numpy as np
- import os
-
-
- # 图像放射变换,与原图对齐
- def get_Homography(src_img,template):
-
-
- surf = cv2.SIFT_create()
- # surf=cv2.xfeatures2d.SIFT_create()#可以改为SIFT
- kp1, descrip1 = surf.detectAndCompute(src_img, None) # 特征点与描述子
- kp2, descrip2 = surf.detectAndCompute(template, None)
-
- if descrip1 is None:
- print("提取特征点错误")
-
- FLANN_INDEX_KDTREE = 0
- indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
- searchParams = dict(checks=50)
-
- flann = cv2.FlannBasedMatcher(indexParams, searchParams)
- match = flann.knnMatch(descrip1, descrip2, k=2)
-
-
- direct = src_img.copy()
-
- good = []
- for i, (m, n) in enumerate(match):
- if (m.distance < 0.5 * n.distance):
- good.append(m)
-
- if len(good) > 5:
- src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
- ano_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
-
- M, mask = cv2.findHomography(src_pts, ano_pts, cv2.RANSAC, 5.0)
- T = np.linalg.inv(M)
- # T[2, 0:3] = [0, 0, 1]
- warpImg = cv2.warpPerspective(template, T, (src_img.shape[1], src_img.shape[0]))
- direct = warpImg.copy()
- return True, direct
- else:
- return False, direct
-
- def find_contour(src_yiwu,warpImage):
- subtracted1 = cv2.subtract(warpImage, src_yiwu) # 将图像image与M相减
- # cv2.imshow("subtract", subtracted1)
-
- subtracted1 = 255 - subtracted1
- # cv2.imshow("subtracted1", subtracted1)
-
- kernel1 = np.ones((5, 5), dtype=np.uint8)
- kernel2 = np.ones((3, 3), dtype=np.uint8)
- gray = cv2.dilate(subtracted1, kernel1, 3) # 1:迭代次数,也就是执行几次膨胀操作
- gray = cv2.erode(gray, kernel2, 1)
-
- # cv2.imshow("gray", gray)
- # cv2.waitKey()
-
- img_median = cv2.medianBlur(gray, 5)
- gray = cv2.erode(img_median, kernel2, 1)
-
- gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
- mean = gray.mean()
-
- ret, thresh = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)
- thresh = 255 - thresh
-
- # cv2.imshow("thresh", thresh)
- contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
-
- if len(contours) == 1:
- print("两次检测所用图相同")
- return False
-
- mianJi = []
- for k in range(len(contours)):
- mianJi.append(cv2.contourArea(contours[k]))
- # cv2.drawContours(src_yiwu, contours, k, (0, 0, 255), 4)
-
- # cv2.imshow("src_yiwutest", src_yiwu)
- # cv2.waitKey()
-
- h, w = src_yiwu.shape[:2]
-
- # 筛选超过平均面积的轮廓
- yiwu_is = []
- for i in range(len(contours)):
- area = cv2.contourArea(contours[i], False)
- if area > max(mianJi)/3 and area < max(mianJi)*1.01:
-
- yiwu_is.append(1)
- # print("轮廓%d的面积是: %d" % (i, area))
- # cv2.drawContours(src_yiwu, contours, i, (0, 0, 255), 5)
- # 绘制椭圆
- ellipse = cv2.fitEllipse(contours[i])
- cv2.ellipse(src_yiwu, ellipse, (0, 0, 255), 2)
-
- # cv2.imshow("contours %d" % i, src_yiwu)
- # cv2.waitKey()
- else:
- yiwu_is.append(0)
-
- cv2.imshow("result", src_yiwu)
- cv2.waitKey()
-
- isExists = os.path.exists("./runs/dectYiwu/")
- if not isExists:
- os.makedirs("./runs/dectYiwu/")
- cv2.imwrite("./runs/dectYiwu/result.jpg", src_yiwu)
-
- if len(set(yiwu_is)) == 1 and 0 in yiwu_is:
- return False
- else:
- return True
-
- def start_dect_yiwu(src_yiwuPath,templatePath):
-
- src_yiwu = cv2.imread(src_yiwuPath) #
- template = cv2.imread(templatePath)
- # cv2.imshow("src_yiwu", src_yiwu)
- # image = src_image.copy()
-
- res_hom = get_Homography(src_yiwu,template)
- # print(res_hom[0])
-
- if res_hom[0] == True:
- warpImage = res_hom[1]
- is_yiwu = find_contour(src_yiwu,warpImage)
- if is_yiwu:
- print("检测到异物,产品不合格!")
- return "检测到异物,不合格"
- else:
- print("无异物,产品合格!")
- return "产品合格"
- else:
- print("无异物,产品合格!")
- return "产品合格"
-
-
-
- if __name__ == "__main__":
-
-
- start_dect_yiwu('Images/yiwu/yiwureal_1101test.jpg','Images/yiwu/src_1101test.jpg')
- start_dect_yiwu('Images/yiwu/yiwureal_1101test01.jpg','Images/yiwu/src_1101test01.jpg')
- start_dect_yiwu('Images/yiwu/yiwureal_1101test02.jpg','Images/yiwu/src_1101test01.jpg')
- start_dect_yiwu('Images/yiwu/yiwureal_1101test03.jpg','Images/yiwu/src_1101test01.jpg')
-
- # # 如果是相同的图像
- start_dect_yiwu('Images/yiwu/yiwureale11.jpg','Images/yiwu/yiwureale11.jpg')
- start_dect_yiwu('Images/yiwu/src_1101test01.jpg','Images/yiwu/src_1101test01.jpg')
- start_dect_yiwu('Images/yiwu/yiwureal01.jpg','Images/yiwu/yiwureal01.jpg')
-
- # # # # yiwu roi
- # img = cv2.imread("Images/Final/E_0_2_is.jpg")
- # # img_yiwu = img[750:1550, 2500:3750]
- # img_yiwu = img[700:1580, 2300:3700]
- #
- # cv2.imshow("img_yiwu", img_yiwu)
- # cv2.imwrite("Images/yiwu/yiwureal_e02test07.jpg",img_yiwu)
- # cv2.waitKey()
- #
- #
- # img = cv2.imread("Images/Final/E_0_2_no.jpg")
- # img_src = img[700:1580, 2300:3700]
- # cv2.imshow("img", img_src)
- # cv2.imwrite("Images/yiwu/src_e02test07.jpg",img_src)
- # cv2.waitKey()
-
-
-
-
- # src_yiwu = cv2.imread('Images/yiwu/yiwu.jpg') #
- # template = cv2.imread('Images/yiwu/template.jpg')
- # AREA_YIWU = 1500
- # # cv2.imshow("src_yiwu", src_yiwu)
- # # image = src_image.copy()
- #
- # res_hom = get_Homography(src_yiwu,template)
- #
- # if res_hom[0] == True:
- # warpImage = res_hom[1]
- # is_yiwu = find_contour(src_yiwu,warpImage, AREA_YIWU)
- # if is_yiwu:
- # print("检测到异物,产品不合格!")
- # else:
- # print("无异物,产品合格!")
- # else:
- # print("无异物,产品合格!")
-
-
