Opencv实现倾斜图片转正示例

 更新时间:2022年08月01日 11:23:26   作者:咕里个咚  
本文主要介绍了Opencv实现倾斜图片转正示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天是我们来玩一个钉子。通过一个钉子来学习一个opencv中的一个函数,这个函数我网上也有搜过,不过遗憾的是,各路好手都是写的是有点不堪入目,现在这个学习氛围是越来越差了,很多人都直接复制粘贴别人的东西,自己也没有理解,也没有辨别是非的能力,所谓的拿来主义有时候真的是要不得的。知其然也要知其所以然。所以你很多时候遇到问题去网上搜索的时候,你会发现浏览器上面一排网页,好多内容都是相同,甚至是错的,这样很不好。

闲话不多说,我们今天通过一个实例来,讲解一个网上很多人都没搞清楚的函数cv2.minAreaRect()

我们用到图片

我们要做的事情是将这个钉子转成水平放心放置,然后抠出钉子的区域,就像下面这个样子

实现步骤:

1.灰度化+二值化,效果图如下

2.找轮廓,cv2.findcounters(),这样的图我们肯定会找到很多轮廓,所以我们可以通过面积来筛选出自己想要的那个轮廓,这里我们选择最大的轮廓,也就是钉子的轮廓,看看效果(红线就是哦我们找到的轮廓点然后连接起来的)

3.找这个轮廓的最小外接矩形(带角度),这个就是最关键的了,也就是我们开头提到的cv2.minAreaRect(),我们要对他的返回值了如执掌。先看看效果呢(蓝线就是我们找到的最小外接矩形)

 这个时候你会说,这有什么难的,我们来细细看一下,cv2.minAreaRect()的返回值是什么

box= cv2.minAreaRect(counter)
print(box)

我们看看这个返回值是一个元组

((257.3854675292969, 292.03851318359375), (454.5963439941406, 140.96072387695312), 48.21548080444336)

元组的第一个元素是这个最小外接矩形的中心点坐标

元组的第二个元素是也是一个元组,这个元组是最小外接矩形的两个边长(注意是两个边长,并不是宽高),这个时候你就会问了,这有什么区别,看上去是没什么区别,其实是由返回顺序的,有的时候长的那条边在这个元组的第一个元素位置,有的时候长的那条边在这个元组的第二个元素位置。不信我在给你看一个返回值

((290.1945495605469, 256.9798889160156), (140.9435577392578, 460.39862060546875), 49.1729850769043)

元组的第三个元素是一个浮点数,这个浮点数也就是这个外接矩形的角度,那么,这个角度又是哪个边的与X轴的角度呢?答案是要根据第二个元组的值长短边的顺序来决定的,这个角度始终是第二元组中第一个元素对应的那条边和x的夹角。而且这个角度永远是大于0的。网上有人说是-90-90°,说实话,经过测试,我们见到负角度的,那些人可能试都没试吧。也就是这个角度。

 我想我已经说明白了

4.根据得到的中心点和角度以及第二个元组的值的大小就可以开始旋转了

值得注意的是,opencv中旋转是逆时针旋转,所以在旋转的时候要注意旋转的角度,看看效果

5.有中心点和两条边长的大小,我们就可以开始抠图了,看看效果

至此Mission accomplished。

我们上代码吧

# -*- coding: utf-8 -*-
# @Time : 2022/7/25 15:51
# @Author : guligedong
import cv2
import os
import numpy as np
 
base_folder = r'F:\mvtec_anomaly_detection\screw\test\good'
for i in os.listdir(base_folder):
    img_path = os.path.join(base_folder, i)
    if img_path.split('.')[-1] == 'db':
        continue
    print(img_path)
    img = cv2.imread(img_path)
    img = cv2.resize(img,(512,512))
    img_h,img_w = img.shape[:2]
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _,bi_img = cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY_INV)
 
    counters,_ = cv2.findContours(bi_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    for index,counter in enumerate(counters):
        if cv2.contourArea(counter) > 10000 :
            cv2.drawContours(img,counters,index,(0,0,255),1)
            box= cv2.minAreaRect(counter)
            print(box)
            boxs= cv2.boxPoints(box)
            boxs = np.int0([boxs])
            print(boxs)
            cv2.polylines(img, boxs, isClosed=True, color=(255, 125, 125), thickness=1)
            cv2.imshow('img', img)
            # cv2.waitKey()
            center_x,center_y = int(box[0][0]),int(box[0][1])
            lenth1, lenth2 = int(box[1][0]), int(box[1][1])
            print(lenth1, lenth2)
            angle = box[2]
            print(angle)
            if lenth1 > lenth2:
                angle  = angle
            else:
                angle = -(90 - angle)
            rotate_matrix = cv2.getRotationMatrix2D(center=(center_x,center_y),angle=angle,scale=1)
            rotated_image = cv2.warpAffine(src=img, M=rotate_matrix, dsize=(img_w, img_h))
            cv2.imshow('Rotated image', rotated_image)
            y_start = center_y - min(lenth1, lenth2) // 2 if center_y - min(lenth1, lenth2) // 2 > 0 else 0
            y_end = center_y + min(lenth1, lenth2) // 2 if center_y + min(lenth1, lenth2) // 2 < img_h else img_h
            x_start = center_x - max(lenth1, lenth2) // 2 if center_x - max(lenth1, lenth2) // 2 >0 else 0
            x_end = center_x + max(lenth1, lenth2) // 2 if center_x + max(lenth1, lenth2) // 2 <img_w else img_w
            crop_image = rotated_image[y_start:y_end,x_start:x_end]
            cv2.imshow('crop_image', crop_image)
            cv2.waitKey()

 这个数据是mvtec_anomaly_detection数据集中的钉子的数据集,大家可以网上找资源试一试小效果,关键是要自己理解这个逻辑。

到此这篇关于Opencv实现倾斜图片转正示例的文章就介绍到这了,更多相关Opencv 倾斜图片转正内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python虚拟环境创建的两种方法

    python虚拟环境创建的两种方法

    本文主要介绍了python虚拟环境创建的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 基于PyQt5制作一个截图翻译工具

    基于PyQt5制作一个截图翻译工具

    这篇文章主要为大家介绍了如何利用PyQt5制作一个简单的截图翻译工具,具有截图功能、翻译功能和文字识别OCR,需要的可以参考一下
    2022-05-05
  • Python7个爬虫小案例详解(附源码)中篇

    Python7个爬虫小案例详解(附源码)中篇

    这篇文章主要介绍了Python7个爬虫小案例详解(附源码)中篇,本文章内容详细,通过案例可以更好的理解爬虫的相关知识,七个例子分为了三部分,本次为中篇,共有二道题,需要的朋友可以参考下
    2023-01-01
  • 十分钟搞定pandas(入门教程)

    十分钟搞定pandas(入门教程)

    这篇文章主要介绍了十分钟搞定pandas(入门教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • MacOS Pytorch 机器学习环境搭建方法

    MacOS Pytorch 机器学习环境搭建方法

    这篇文章主要介绍了MacOS Pytorch 机器学习环境搭建,学习 Pytorch ,首先要搭建好环境,这里将采用 Anoconda + Pytorch + PyCharm 来一起构建 Pytorch 学习环境,需要的朋友可以参考下
    2023-02-02
  • Python解决线性代数问题之矩阵的初等变换方法

    Python解决线性代数问题之矩阵的初等变换方法

    今天小编就为大家分享一篇Python解决线性代数问题之矩阵的初等变换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python获取本机mac地址和ip地址的方法

    python获取本机mac地址和ip地址的方法

    这篇文章主要介绍了python获取本机mac地址和ip地址的方法,涉及Python获取系统相关信息的技巧,需要的朋友可以参考下
    2015-04-04
  • Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决

    Python3下错误AttributeError: ‘dict’ object has no attribute’ite

    这篇文章主要跟大家介绍了关于在Python3下错误AttributeError: 'dict' object has no attribute 'iteritems'的分析与解决方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • python中使用矢量化替换循环详解

    python中使用矢量化替换循环详解

    矢量化是在数据集上实现 (NumPy) 数组操作的技术。在后台,它将操作一次性应用于数组或系列的所有元素(不同于一次操作一行的“for”循环)。
    2023-01-01
  • python+pytest接口自动化之session会话保持的实现

    python+pytest接口自动化之session会话保持的实现

    在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,本文主要介绍了python+pytest接口自动化之session会话保持的实现,感兴趣的可以了解一下
    2022-06-06

最新评论