• 检测零件的缝隙中是否有异物


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

     PlanA

    1. import matplotlib.image as pltimg
    2. import matplotlib.pyplot as plt
    3. image = pltimg.imread("./flower.jpg", 1)
    4. image_01 = image.copy()
    5. sub_image = image - image_01
    6. plt.imshow(sub_image)
    7. plt.show()
    8. # plt.waitforbuttonpress(0)

    PlanB

    1. image = cv2.imread("./flower.jpg", 1)
    2. img = image.copy()
    3. result = cv2.subtract(image, img)
    4. cv2.imshow("res", result)
    5. cv2.waitKey()

    PlanC

    1. import cv2
    2. import numpy as np
    3. import os
    4. # 图像放射变换,与原图对齐
    5. def get_Homography(src_img,template):
    6. surf = cv2.SIFT_create()
    7. # surf=cv2.xfeatures2d.SIFT_create()#可以改为SIFT
    8. kp1, descrip1 = surf.detectAndCompute(src_img, None) # 特征点与描述子
    9. kp2, descrip2 = surf.detectAndCompute(template, None)
    10. if descrip1 is None:
    11. print("提取特征点错误")
    12. FLANN_INDEX_KDTREE = 0
    13. indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    14. searchParams = dict(checks=50)
    15. flann = cv2.FlannBasedMatcher(indexParams, searchParams)
    16. match = flann.knnMatch(descrip1, descrip2, k=2)
    17. direct = src_img.copy()
    18. good = []
    19. for i, (m, n) in enumerate(match):
    20. if (m.distance < 0.5 * n.distance):
    21. good.append(m)
    22. if len(good) > 5:
    23. src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
    24. ano_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
    25. M, mask = cv2.findHomography(src_pts, ano_pts, cv2.RANSAC, 5.0)
    26. T = np.linalg.inv(M)
    27. # T[2, 0:3] = [0, 0, 1]
    28. warpImg = cv2.warpPerspective(template, T, (src_img.shape[1], src_img.shape[0]))
    29. direct = warpImg.copy()
    30. return True, direct
    31. else:
    32. return False, direct
    33. def find_contour(src_yiwu,warpImage):
    34. subtracted1 = cv2.subtract(warpImage, src_yiwu) # 将图像image与M相减
    35. # cv2.imshow("subtract", subtracted1)
    36. subtracted1 = 255 - subtracted1
    37. # cv2.imshow("subtracted1", subtracted1)
    38. kernel1 = np.ones((5, 5), dtype=np.uint8)
    39. kernel2 = np.ones((3, 3), dtype=np.uint8)
    40. gray = cv2.dilate(subtracted1, kernel1, 3) # 1:迭代次数,也就是执行几次膨胀操作
    41. gray = cv2.erode(gray, kernel2, 1)
    42. # cv2.imshow("gray", gray)
    43. # cv2.waitKey()
    44. img_median = cv2.medianBlur(gray, 5)
    45. gray = cv2.erode(img_median, kernel2, 1)
    46. gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
    47. mean = gray.mean()
    48. ret, thresh = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)
    49. thresh = 255 - thresh
    50. # cv2.imshow("thresh", thresh)
    51. contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    52. if len(contours) == 1:
    53. print("两次检测所用图相同")
    54. return False
    55. mianJi = []
    56. for k in range(len(contours)):
    57. mianJi.append(cv2.contourArea(contours[k]))
    58. # cv2.drawContours(src_yiwu, contours, k, (0, 0, 255), 4)
    59. # cv2.imshow("src_yiwutest", src_yiwu)
    60. # cv2.waitKey()
    61. h, w = src_yiwu.shape[:2]
    62. # 筛选超过平均面积的轮廓
    63. yiwu_is = []
    64. for i in range(len(contours)):
    65. area = cv2.contourArea(contours[i], False)
    66. if area > max(mianJi)/3 and area < max(mianJi)*1.01:
    67. yiwu_is.append(1)
    68. # print("轮廓%d的面积是: %d" % (i, area))
    69. # cv2.drawContours(src_yiwu, contours, i, (0, 0, 255), 5)
    70. # 绘制椭圆
    71. ellipse = cv2.fitEllipse(contours[i])
    72. cv2.ellipse(src_yiwu, ellipse, (0, 0, 255), 2)
    73. # cv2.imshow("contours %d" % i, src_yiwu)
    74. # cv2.waitKey()
    75. else:
    76. yiwu_is.append(0)
    77. cv2.imshow("result", src_yiwu)
    78. cv2.waitKey()
    79. isExists = os.path.exists("./runs/dectYiwu/")
    80. if not isExists:
    81. os.makedirs("./runs/dectYiwu/")
    82. cv2.imwrite("./runs/dectYiwu/result.jpg", src_yiwu)
    83. if len(set(yiwu_is)) == 1 and 0 in yiwu_is:
    84. return False
    85. else:
    86. return True
    87. def start_dect_yiwu(src_yiwuPath,templatePath):
    88. src_yiwu = cv2.imread(src_yiwuPath) #
    89. template = cv2.imread(templatePath)
    90. # cv2.imshow("src_yiwu", src_yiwu)
    91. # image = src_image.copy()
    92. res_hom = get_Homography(src_yiwu,template)
    93. # print(res_hom[0])
    94. if res_hom[0] == True:
    95. warpImage = res_hom[1]
    96. is_yiwu = find_contour(src_yiwu,warpImage)
    97. if is_yiwu:
    98. print("检测到异物,产品不合格!")
    99. return "检测到异物,不合格"
    100. else:
    101. print("无异物,产品合格!")
    102. return "产品合格"
    103. else:
    104. print("无异物,产品合格!")
    105. return "产品合格"
    106. if __name__ == "__main__":
    107. start_dect_yiwu('Images/yiwu/yiwureal_1101test.jpg','Images/yiwu/src_1101test.jpg')
    108. start_dect_yiwu('Images/yiwu/yiwureal_1101test01.jpg','Images/yiwu/src_1101test01.jpg')
    109. start_dect_yiwu('Images/yiwu/yiwureal_1101test02.jpg','Images/yiwu/src_1101test01.jpg')
    110. start_dect_yiwu('Images/yiwu/yiwureal_1101test03.jpg','Images/yiwu/src_1101test01.jpg')
    111. # # 如果是相同的图像
    112. start_dect_yiwu('Images/yiwu/yiwureale11.jpg','Images/yiwu/yiwureale11.jpg')
    113. start_dect_yiwu('Images/yiwu/src_1101test01.jpg','Images/yiwu/src_1101test01.jpg')
    114. start_dect_yiwu('Images/yiwu/yiwureal01.jpg','Images/yiwu/yiwureal01.jpg')
    115. # # # # yiwu roi
    116. # img = cv2.imread("Images/Final/E_0_2_is.jpg")
    117. # # img_yiwu = img[750:1550, 2500:3750]
    118. # img_yiwu = img[700:1580, 2300:3700]
    119. #
    120. # cv2.imshow("img_yiwu", img_yiwu)
    121. # cv2.imwrite("Images/yiwu/yiwureal_e02test07.jpg",img_yiwu)
    122. # cv2.waitKey()
    123. #
    124. #
    125. # img = cv2.imread("Images/Final/E_0_2_no.jpg")
    126. # img_src = img[700:1580, 2300:3700]
    127. # cv2.imshow("img", img_src)
    128. # cv2.imwrite("Images/yiwu/src_e02test07.jpg",img_src)
    129. # cv2.waitKey()
    130. # src_yiwu = cv2.imread('Images/yiwu/yiwu.jpg') #
    131. # template = cv2.imread('Images/yiwu/template.jpg')
    132. # AREA_YIWU = 1500
    133. # # cv2.imshow("src_yiwu", src_yiwu)
    134. # # image = src_image.copy()
    135. #
    136. # res_hom = get_Homography(src_yiwu,template)
    137. #
    138. # if res_hom[0] == True:
    139. # warpImage = res_hom[1]
    140. # is_yiwu = find_contour(src_yiwu,warpImage, AREA_YIWU)
    141. # if is_yiwu:
    142. # print("检测到异物,产品不合格!")
    143. # else:
    144. # print("无异物,产品合格!")
    145. # else:
    146. # print("无异物,产品合格!")

     

  • 相关阅读:
    修复SpringBoot Actuator未授权访问遇到的问题
    会议OA项目(三)---我的会议(会议排座、送审)
    PyQt5可视化编程-布局管理
    什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用?
    我的世界Minecraft基岩版开服教程(Linux)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器
    ChinaSkills技能大赛网络系统管理Debian模块(样题一)||SERVER03 TASK配置
    基于SSM的星空游戏购买下载平台
    如何在WPF网格中隐藏行
    Uniapp 跳转回上一页面并刷新页面数据
    可以一键生成热点营销视频的工具,建议收藏
  • 原文地址:https://blog.csdn.net/moonlightpeng/article/details/127626272