最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Opencv實(shí)現(xiàn)傾斜圖片轉(zhuǎn)正示例

 更新時(shí)間:2022年08月01日 11:23:26   作者:咕里個(gè)咚  
本文主要介紹了Opencv實(shí)現(xiàn)傾斜圖片轉(zhuǎn)正示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天是我們來玩一個(gè)釘子。通過一個(gè)釘子來學(xué)習(xí)一個(gè)opencv中的一個(gè)函數(shù),這個(gè)函數(shù)我網(wǎng)上也有搜過,不過遺憾的是,各路好手都是寫的是有點(diǎn)不堪入目,現(xiàn)在這個(gè)學(xué)習(xí)氛圍是越來越差了,很多人都直接復(fù)制粘貼別人的東西,自己也沒有理解,也沒有辨別是非的能力,所謂的拿來主義有時(shí)候真的是要不得的。知其然也要知其所以然。所以你很多時(shí)候遇到問題去網(wǎng)上搜索的時(shí)候,你會(huì)發(fā)現(xiàn)瀏覽器上面一排網(wǎng)頁,好多內(nèi)容都是相同,甚至是錯(cuò)的,這樣很不好。

閑話不多說,我們今天通過一個(gè)實(shí)例來,講解一個(gè)網(wǎng)上很多人都沒搞清楚的函數(shù)cv2.minAreaRect()

我們用到圖片

我們要做的事情是將這個(gè)釘子轉(zhuǎn)成水平放心放置,然后摳出釘子的區(qū)域,就像下面這個(gè)樣子

實(shí)現(xiàn)步驟:

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

2.找輪廓,cv2.findcounters(),這樣的圖我們肯定會(huì)找到很多輪廓,所以我們可以通過面積來篩選出自己想要的那個(gè)輪廓,這里我們選擇最大的輪廓,也就是釘子的輪廓,看看效果(紅線就是哦我們找到的輪廓點(diǎn)然后連接起來的)

3.找這個(gè)輪廓的最小外接矩形(帶角度),這個(gè)就是最關(guān)鍵的了,也就是我們開頭提到的cv2.minAreaRect(),我們要對他的返回值了如執(zhí)掌。先看看效果呢(藍(lán)線就是我們找到的最小外接矩形)

 這個(gè)時(shí)候你會(huì)說,這有什么難的,我們來細(xì)細(xì)看一下,cv2.minAreaRect()的返回值是什么

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

我們看看這個(gè)返回值是一個(gè)元組

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

元組的第一個(gè)元素是這個(gè)最小外接矩形的中心點(diǎn)坐標(biāo)

元組的第二個(gè)元素是也是一個(gè)元組,這個(gè)元組是最小外接矩形的兩個(gè)邊長(注意是兩個(gè)邊長,并不是寬高),這個(gè)時(shí)候你就會(huì)問了,這有什么區(qū)別,看上去是沒什么區(qū)別,其實(shí)是由返回順序的,有的時(shí)候長的那條邊在這個(gè)元組的第一個(gè)元素位置,有的時(shí)候長的那條邊在這個(gè)元組的第二個(gè)元素位置。不信我在給你看一個(gè)返回值

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

元組的第三個(gè)元素是一個(gè)浮點(diǎn)數(shù),這個(gè)浮點(diǎn)數(shù)也就是這個(gè)外接矩形的角度,那么,這個(gè)角度又是哪個(gè)邊的與X軸的角度呢?答案是要根據(jù)第二個(gè)元組的值長短邊的順序來決定的,這個(gè)角度始終是第二元組中第一個(gè)元素對應(yīng)的那條邊和x的夾角。而且這個(gè)角度永遠(yuǎn)是大于0的。網(wǎng)上有人說是-90-90°,說實(shí)話,經(jīng)過測試,我們見到負(fù)角度的,那些人可能試都沒試吧。也就是這個(gè)角度。

 我想我已經(jīng)說明白了

4.根據(jù)得到的中心點(diǎn)和角度以及第二個(gè)元組的值的大小就可以開始旋轉(zhuǎn)了

值得注意的是,opencv中旋轉(zhuǎn)是逆時(shí)針旋轉(zhuǎn),所以在旋轉(zhuǎn)的時(shí)候要注意旋轉(zhuǎn)的角度,看看效果

5.有中心點(diǎn)和兩條邊長的大小,我們就可以開始摳圖了,看看效果

至此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()

 這個(gè)數(shù)據(jù)是mvtec_anomaly_detection數(shù)據(jù)集中的釘子的數(shù)據(jù)集,大家可以網(wǎng)上找資源試一試小效果,關(guān)鍵是要自己理解這個(gè)邏輯。

到此這篇關(guān)于Opencv實(shí)現(xiàn)傾斜圖片轉(zhuǎn)正示例的文章就介紹到這了,更多相關(guān)Opencv 傾斜圖片轉(zhuǎn)正內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python虛擬環(huán)境創(chuàng)建的兩種方法

    python虛擬環(huán)境創(chuàng)建的兩種方法

    本文主要介紹了python虛擬環(huán)境創(chuàng)建的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 基于PyQt5制作一個(gè)截圖翻譯工具

    基于PyQt5制作一個(gè)截圖翻譯工具

    這篇文章主要為大家介紹了如何利用PyQt5制作一個(gè)簡單的截圖翻譯工具,具有截圖功能、翻譯功能和文字識別OCR,需要的可以參考一下
    2022-05-05
  • Python7個(gè)爬蟲小案例詳解(附源碼)中篇

    Python7個(gè)爬蟲小案例詳解(附源碼)中篇

    這篇文章主要介紹了Python7個(gè)爬蟲小案例詳解(附源碼)中篇,本文章內(nèi)容詳細(xì),通過案例可以更好的理解爬蟲的相關(guān)知識,七個(gè)例子分為了三部分,本次為中篇,共有二道題,需要的朋友可以參考下
    2023-01-01
  • 十分鐘搞定pandas(入門教程)

    十分鐘搞定pandas(入門教程)

    這篇文章主要介紹了十分鐘搞定pandas(入門教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • MacOS?Pytorch?機(jī)器學(xué)習(xí)環(huán)境搭建方法

    MacOS?Pytorch?機(jī)器學(xué)習(xí)環(huán)境搭建方法

    這篇文章主要介紹了MacOS?Pytorch?機(jī)器學(xué)習(xí)環(huán)境搭建,學(xué)習(xí) Pytorch?,首先要搭建好環(huán)境,這里將采用?Anoconda + Pytorch + PyCharm 來一起構(gòu)建 Pytorch 學(xué)習(xí)環(huán)境,需要的朋友可以參考下
    2023-02-02
  • Python解決線性代數(shù)問題之矩陣的初等變換方法

    Python解決線性代數(shù)問題之矩陣的初等變換方法

    今天小編就為大家分享一篇Python解決線性代數(shù)問題之矩陣的初等變換方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python獲取本機(jī)mac地址和ip地址的方法

    python獲取本機(jī)mac地址和ip地址的方法

    這篇文章主要介紹了python獲取本機(jī)mac地址和ip地址的方法,涉及Python獲取系統(tǒng)相關(guān)信息的技巧,需要的朋友可以參考下
    2015-04-04
  • Python3下錯(cuò)誤AttributeError: ‘dict’ object has no attribute’iteritems‘的分析與解決

    Python3下錯(cuò)誤AttributeError: ‘dict’ object has no attribute’ite

    這篇文章主要跟大家介紹了關(guān)于在Python3下錯(cuò)誤AttributeError: 'dict' object has no attribute 'iteritems'的分析與解決方法,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • python中使用矢量化替換循環(huán)詳解

    python中使用矢量化替換循環(huán)詳解

    矢量化是在數(shù)據(jù)集上實(shí)現(xiàn) (NumPy) 數(shù)組操作的技術(shù)。在后臺(tái),它將操作一次性應(yīng)用于數(shù)組或系列的所有元素(不同于一次操作一行的“for”循環(huán))。
    2023-01-01
  • python+pytest接口自動(dòng)化之session會(huì)話保持的實(shí)現(xiàn)

    python+pytest接口自動(dòng)化之session會(huì)話保持的實(shí)現(xiàn)

    在接口測試的過程中,經(jīng)常會(huì)遇到有些接口需要在登錄的狀態(tài)下才能請求,本文主要介紹了python+pytest接口自動(dòng)化之session會(huì)話保持的實(shí)現(xiàn),感興趣的可以了解一下
    2022-06-06

最新評論

大竹县| 三河市| 武功县| 鹤峰县| 海城市| 吉木萨尔县| 常熟市| 永靖县| 白朗县| 龙泉市| 犍为县| 巴彦淖尔市| 永登县| 新乡市| 石渠县| 固阳县| 济源市| 陆川县| 昭通市| 罗城| 喜德县| 东台市| 嘉祥县| 景谷| 秀山| 张家口市| 德化县| 梅河口市| 丹阳市| 丰镇市| 伊宁县| 洛川县| 富源县| 浠水县| 栾城县| 台北县| 洞口县| 喀喇| 文水县| 宜昌市| 定州市|