Opencv-Python查找手机缺陷(含Gui界面-PyQt5实现)

  • 两个月前刚学Opencv的泄作(代码在文章下边)
    • 效果比较好的就是确定手机的屏幕
    • 查找缺陷方面效果不是很理想
    • 有空会考虑进行优化一下​​​​​​​        

这是界面图,字体设计的不是很好,这期主要讲Opencv方面的,后边会补一个关于PyQt5的代码详解

效果图

没有缺陷的时候会显示硬核拼音提示

 

 可以看到上边缺陷寻找的不是很理想,但是这个检测手机出来的效果十分好

  • 接下就是Opencv代码部分
    • 首先从图片确定手机的位置
    • 缺陷分类识别

 大概思路:

                获取目标前景因为还有一些花岗岩背景所以要对图像进行一系列操作,然后裁剪图片进行缺陷识别,这里也可以使用矩阵的距离变换实现,我用的是裁剪图片

        

image = cv2.blur(image,(3,3))
image = cv2.blur(image,(3,3))
image = cv2.blur(image,(3,3))

先对图像进行三次滤波操作,如果二值化后在进行滤波操作可能会损失手机的白色边框

 滤波后的图像

  •            二值化图像得到理想的轮廓
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)             # 灰度图
t1, image  = cv2.threshold(image,170,255,cv2.THRESH_TOZERO)

 

 二值化图像,剩下来的就很简单了

listArea = [0]*100
for i in range(0, len(contours)):               # 遍历所有的统计的轮廓的次数
   x, y, w, h = cv2.boundingRect(contours[i])
                #       取最大矩形面积     #
                #       筛选      #
   Area = w * h
   listArea[i] = Area
a = max(listArea)
for i in range(0, len(contours)):               # 遍历所有的统计的轮廓的次数
   x, y, w, h = cv2.boundingRect(contours[i])
   Area = w * h
   if Area < a and Area > 400 :
    cv2.rectangle(image3, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 画矩形
    image10 = image3[y:y + h, x:x + w]  # 剪切屏幕出来
    cv2.imshow("10", image10)
   if Area == a:
       cv2.rectangle(image3, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 画矩形
       cv2.putText(image3, "Phone", (x, y), cv2.FONT_HERSHEY_DUPLEX, 2, (0, 255, 0), 1)  # 放文字

裁剪屏幕,因为当时是没有Python基础的,所以一些定义看起来怪怪的(这个忽略就好)

  • 代码总体意思
    • ​​​​​​​检测物体轮廓,然后通过cv2.boundingRect取轮廓的最大外接矩形
    • Area = w * h求出Area的轮廓的面积,像素不同的面积也肯定不同但是好在噪声的面积不会很大,这也就能通过筛选面积求出手机的坐标信息了,
      • 第一个for首先求出所有轮廓的正方形面积,然后在第二个for里边通过给出的所有面积来进行筛选
      • 这里对很多图像进行了一个测试一般一些噪声的面积都会在100左右,即使图像分辨率很高面积也不会大于300所以只要面积大于400的我们认定他就是手机
      • 至于为什么这里有一个Max值a呢这是因为有些手机有外边的边框和里边的包裹的屏幕形成的所以我们会得到两个大于400的值,最大那个自然就是边框了,比400大比最大值小的自然就是手机的屏幕,如果你想整部手机检测进去的话就在倒数第二个if语句改成Area == a即可

剩下的就是我们手机缺陷的查找(摆----烂)

        

 可以看到效果不是很好(界面那里给出了宁外两个,我这里就讲这个了)

image = cv2.add(image, image)
image = cv2.add(image, image)
        #       转灰      #
image = cv2.cvtColor(image, cv2.COLOR_RGBA2GRAY)
        #       二值化     #
t1, image = cv2.threshold(image, 250, 255, cv2.THRESH_BINARY)
image123 = image.copy()
        #       腐蚀      #
image123 = cv2.dilate(image123, (12, 12))
imageCAA = cv2.add(image123, image123)
imageCAA = cv2.dilate(imageCAA, (12, 12))
imageCAA = cv2.dilate(imageCAA, (12, 12))
imageCAA = cv2.dilate(imageCAA, (12, 12))
imageCAA = cv2.dilate(imageCAA, (12, 12))

图像的处理,原本是打算不停的增强线的对比度然后联通划痕在进行识别的,但是太难搞了就放弃了

处理好的图像

imageCAA = cv2.medianBlur(imageCAA, 15)

中值滤波后

 后边老套路了,找轮廓,凸包完事了

        

 代码老样子塞名片群里头了,主要是Github不会使,csdn又塞不了压缩包

猜你喜欢

转载自blog.csdn.net/qq_62095154/article/details/122513429