今天是我们来玩一个钉子。通过一个钉子来学习一个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 npbase_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':continueprint(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  = angleelse: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 0y_end = center_y + min(lenth1, lenth2) // 2 if center_y + min(lenth1, lenth2) // 2 < img_h else img_hx_start = center_x - max(lenth1, lenth2) // 2 if center_x - max(lenth1, lenth2) // 2 >0 else 0x_end = center_x + max(lenth1, lenth2) // 2 if center_x + max(lenth1, lenth2) // 2 <img_w else img_wcrop_image = rotated_image[y_start:y_end,x_start:x_end]cv2.imshow('crop_image', crop_image)cv2.waitKey()

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

至此,salute!!!!

老规矩上咩咩

【Opencv】-----倾斜图片转正相关推荐

  1. python图片旋转脚本_Python+OpenCV 实现图片无损旋转90°且无黑边

    0. 引言 有如上一张图片,在以往的图像旋转处理中,往往得到如图所示的图片. 然而,在进行一些其他图像处理或者图像展示时,黑边带来了一些不便.本文解决图片旋转后出现黑边的问题,实现了图片尺寸不变的旋转 ...

  2. python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和 ...

  3. python opencv 得到图片路径image_path的宽wide、高heigh和深度deep

    python opencv 得到图片路径image_path的宽wide.高heigh和深度deep 图片路径是:'1.jpg' 下面是具体代码: import cv2 #得到图片路径image_pa ...

  4. OPENCV打开图片进行边缘检测

    OPENCV打开图片并且进行边缘检测 #ifdef _CH_ #pragma package <opencv> #endif#ifndef _EiC #include "cv.h ...

  5. opencv去除图片的高光

    opencv去除图片的高光 有明显的修补痕迹 https://blog.csdn.net/qq_43555843/article/details/102510425 参考这个: https://blo ...

  6. DALSA线阵CCD相机开发 之 opencv读取图片

    SDK的下载 Sapera_LT_8.31_SDK 百度网盘下载地址:链接:密码:ckm7. SDK的安装 解压运行.exe文件,按照提示确定,下一步即可. 帮助文档和demo 如果要获得完整的帮助文 ...

  7. 2021-01-07 python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和亮 ...

  8. OpenCV显示图片的实例(附完整代码)

    OpenCV显示图片的实例 OpenCV显示图片的实例 OpenCV显示图片的实例 #include <opencv2/core.hpp> #include <opencv2/img ...

  9. python opencv图片放大 缩小_Python OpenCV之图片缩放的实现(cv2.resize)

    OpenCV函数原型: cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation) 参数解释: InputArra ...

最新文章

  1. 面试高频题:单链表的逆置操作/链表逆序
  2. 如何通过人工智能“避开”内容安全的“坑”?
  3. 通过lseek产生空洞文件
  4. matlab绘制路线图_绘制国际水域路线图
  5. 北大计算机科学与技术专业河南录取分数线,北京大学河南录取分数线|2021北京大学河南分数线|2021年北京大学河南高考分数线|2021年北京大学河南招生计划录取人数...
  6. Hadoop基础知识
  7. http和webservice接口区别
  8. 【java学习之路】(java框架)006.springIOC
  9. java如何用异或符号实现两个变量值的交换
  10. 助学贷款系统导入预申请时问题解决办法汇总
  11. Twaver-HTML5基础学习(12)连线(Link)
  12. IDEA连接数据库后在数据表里添加外键的两种方式
  13. Nginx介绍及安装配置
  14. 封闭环境下的人性博弈——长文纪念诺兰的蝙蝠侠三部曲
  15. ORR R0,R0,#R1_nF:OR:R1_iA
  16. 依图科技(北京)计算机视觉算法实习生面经-2020年10月
  17. Java中的即时编译器
  18. python开机自启切换每日必应壁纸
  19. 高德地图API--天气查询
  20. Android USB(OTG) 删除文件的探索过程

热门文章

  1. 美国电脑出货量的现实和思考
  2. 巴斯卡(Pascal)三角形
  3. 《Predicting Defective Lines Using a Model-Agnostic Technique》论文笔记
  4. JVM(四)_性能监控与调优
  5. 细细品味Ubuntu Scope中的category renderer模版
  6. 网页密码查看器+原代码+windows密码查看
  7. Java实现画图软件(Swing)
  8. ArcMap中Shapefile和dBASE文件的创建与管理
  9. 电子商务网站开发流程[转]
  10. Python金融大数据分析-BSM、Term Struc、Ho-Lee 与Vasicek模型路径仿真