广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Opencv实现倾斜图片转正示例
  • 535
分享到

Opencv实现倾斜图片转正示例

2024-04-02 19:04:59 535人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

今天是我们来玩一个钉子。通过一个钉子来学习一个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 倾斜图片转正内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Opencv实现倾斜图片转正示例

本文链接: https://www.lsjlt.com/news/119713.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Opencv实现倾斜图片转正示例
    今天是我们来玩一个钉子。通过一个钉子来学习一个opencv中的一个函数,这个函数我网上也有搜过,不过遗憾的是,各路好手都是写的是有点不堪入目,现在这个学习氛围是越来越差了,很多人都直...
    99+
    2022-11-11
  • opencv实现图像倾斜校正
    本文实例为大家分享了opencv实现图像倾斜校正的具体代码,供大家参考,具体内容如下 今天的任务是如图这两种情况,我现在的情况是和如图一样的,左图左边倾斜一点儿,那么我需要把左边压...
    99+
    2022-11-13
    opencv图像倾斜校正 opencv图像校正 opencv倾斜校正
  • python中opencv实现图片文本倾斜校正
    本项目为python项目需要安装python及python的opencv模块:opencv_python-4.0.1-cp37-cp37m-win32.whl 和 python的矩阵...
    99+
    2022-11-12
  • OpenCV实现倾斜文字校正
    基于OpenCV的倾斜文字校正,供大家参考,具体内容如下 使用OpenCV里example中的的倾斜文本作为输入,本文的目的即将该倾斜的文本校正成水平方向的文本。 主要思路为: 读取...
    99+
    2022-11-13
    OpenCV倾斜文字校正 OpenCV倾斜校正 OpenCV文字校正
  • opencv图片的任意角度旋转实现示例
    目录一 旋转角度坐标的计算二 旋转任意角度的步骤三 实现一 旋转角度坐标的计算 1.如果O点为圆心,则点P绕点O旋转redian弧度之后,点P的坐标变换为点Q的计算公式为: Q.x=...
    99+
    2022-11-12
  • css3怎么实现超立体3D图片侧翻倾斜效果
    这篇文章主要讲解了“css3怎么实现超立体3D图片侧翻倾斜效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3怎么实现超立体3D图片侧翻倾斜效果”吧!...
    99+
    2022-10-19
  • Python opencv应用实现图片切分操作示例
    目录说明操作说明代码切换效果说明 之前下载来zip包的漫画,里面的图片都是两张一起的: 但是某些漫画查看软件不支持自动分屏,看起来会比较不舒服,所以只能自己动手来切分。 操作说明 ...
    99+
    2022-11-11
  • webpack图片转为base64的实现示例
    下载url-loader yarn add -D url-loader module: { rules: [ { test: /\.(jpeg...
    99+
    2022-11-12
  • C++ opencv图像处理实现图片边缘检测示例
    目录边缘检测简介一、边缘检测步骤二、Canny1.函数2.代码二、Sobel1.函数2.代码三、Scharr1.函数2.代码四、Laplacian1.函数2.代码总结边缘检测简介 边...
    99+
    2022-11-13
  • C++opencv图像处理实现图片几何变换示例
    目录简介一、图像平移1.图像平移代码 (不改变图像大小)2.图像平移代码 (改变图像大小)二、图像旋转1.图像旋转函数2.仿射变换函数3.代码三、图像缩放1.图像缩放函数2.图像缩小...
    99+
    2022-11-13
  • 最近较流行的效果 Android自定义View实现倾斜列表/图片
    先看看效果图: 实现思路:擦除图片相应的角,然后层叠图片,产生倾斜效果 代码实现: 1、定义属性 在values文件夹下的attrs文件添加以下代码 <resourc...
    99+
    2022-06-06
    列表 view 图片 Android
  • C++ opencv实现在图片上画一条线示例代码
    1 在图片上用鼠标进行操作,opencv主要用到setMouseCallback()函数。 winname 窗口名称 onMouse 鼠标事件的回调函数 userdata 传递给回...
    99+
    2022-11-13
  • JS实现将图片URL转base64示例详解
    目录背景介绍出现意外进入正题吧nodejs中间层转总结背景介绍 最近有个需求是将部分DOM生成图片上传到服务器,这里就直接用之前项目使用的 html-to-image。 然而,这次...
    99+
    2023-05-13
    JS图片URL转base64 URL base64
  • OpenCV自动给图片添加彩虹特效的实现示例
    目录背景介绍 实现步骤【1】准备一张夏季风景图片,加载读取【2】创建一张与原图同样大小的黑图,然后通过画椭圆函数绘制彩虹【3】高斯模糊,让彩虹边缘更柔和过渡【4】彩虹图像与风景图混合...
    99+
    2022-11-12
  • Java实现pdf转图片案例
    工程加入依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <art...
    99+
    2022-11-12
  • OpenCV 图像金字塔的实现示例
    目录1.高斯金字塔2.拉普拉斯金字塔本文主要介绍了OpenCV 图像金字塔,具有一定的参考价值,感兴趣的可以了解一下 高斯金字...
    99+
    2022-11-12
  • Python OpenCV 图像平移的实现示例
    每次学习新东西的时候,橡皮擦都是去海量检索,然后找到适合自己理解的部分。 再将其拼凑成一个小的系统,争取对该内容有初步理解。 今天这 1 个小时,核心要学习的是图像的平移,在电脑上随...
    99+
    2022-11-12
  • Python OpenCV实现传统图片格式与base64转换
    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法。通过http传输图片常常将图片数据转换成base64之后再进行传输...
    99+
    2022-11-12
  • OpenCV全景图像拼接的实现示例
    本文主要介绍了OpenCV全景图像拼接的实现示例,分享给大家,具体如下: left_01.jpg right_01.jpg Stitcher.py import numpy ...
    99+
    2022-11-12
  • Python OpenCV实现图形检测示例详解
    目录1. 轮廓识别与描绘1.1 cv2.findComtours()方法1.2 cv2.drawContours() 方法1.3 代码示例2. 轮廓拟合2.1 矩形包围框拟合 - c...
    99+
    2022-11-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作