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

Python+Opencv實(shí)現(xiàn)物體尺寸測(cè)量的方法詳解

 更新時(shí)間:2022年09月14日 14:21:59   作者:夏天是冰紅茶  
這篇文章主要為大家詳細(xì)介紹了Python+Opencv如何實(shí)現(xiàn)物體尺寸測(cè)量的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1、效果展示

我們將以兩種方式來(lái)展示我們這個(gè)項(xiàng)目的效果。

下面這是視頻的實(shí)時(shí)檢測(cè),我分別用了盒子和蓋子來(lái)檢測(cè),按理來(lái)說(shuō)效果不應(yīng)該怎么差的,但我實(shí)在沒(méi)有找到合適的背景與物體。且我的攝像頭使用的是外設(shè),我不得不手持,所以存在一點(diǎn)點(diǎn)的抖動(dòng),但我可以保證,它是缺少了適合檢測(cè)物體與背景。

我使用手機(jī)拍了一張照片并經(jīng)過(guò)了ps修改了背景,效果不錯(cuò)。

2、項(xiàng)目介紹

本項(xiàng)目中,我將選用A4紙張為背景,找到放在該區(qū)域中對(duì)象的長(zhǎng)、寬。打印出相關(guān)的數(shù)值。

3、項(xiàng)目搭建

所有的資源,你都可以在我的GitHub上找到,我將在末尾附上鏈接

4、utils.py文件代碼展示與講解

在項(xiàng)目當(dāng)中,我將引入utils,而utils是適用于在我們項(xiàng)目中所寫的的文件。有了對(duì)它的理解能幫助我們更好的理解本項(xiàng)目,所以我覺(jué)得有必要在此敘述一番。

import cv2
import numpy as np
 
 
def getContours(img, cThr=[100, 100], showCanny=False, minArea=1000, filter=0, draw=False):
    imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)
    imgCanny = cv2.Canny(imgBlur, cThr[0], cThr[1])
    kernel = np.ones((5, 5))
    imgDial = cv2.dilate(imgCanny, kernel, iterations=3)
    imgThre = cv2.erode(imgDial, kernel, iterations=2)
    if showCanny: cv2.imshow('Canny', imgThre)
    contours, hiearchy = cv2.findContours(imgThre, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    finalCountours = []
    for i in contours:
        area = cv2.contourArea(i)
        if area > minArea:
            peri = cv2.arcLength(i, True)
            approx = cv2.approxPolyDP(i, 0.02 * peri, True)
            bbox = cv2.boundingRect(approx)
            if filter > 0:
                if len(approx) == filter:
                    finalCountours.append([len(approx), area, approx, bbox, i])
            else:
                finalCountours.append([len(approx), area, approx, bbox, i])
    finalCountours = sorted(finalCountours, key=lambda x: x[1], reverse=True)
    if draw:
        for con in finalCountours:
            cv2.drawContours(img, con[4], -1, (0, 0, 255), 3)
    return img, finalCountours
 
 
def reorder(myPoints):
    # print(myPoints.shape)
    myPointsNew = np.zeros_like(myPoints)
    myPoints = myPoints.reshape((4, 2))
    add = myPoints.sum(1)
    myPointsNew[0] = myPoints[np.argmin(add)]
    myPointsNew[3] = myPoints[np.argmax(add)]
    diff = np.diff(myPoints, axis=1)
    myPointsNew[1] = myPoints[np.argmin(diff)]
    myPointsNew[2] = myPoints[np.argmax(diff)]
    return myPointsNew
 
 
def warpImg(img, points, w, h, pad=20):
    # print(points)
    points = reorder(points)
    pts1 = np.float32(points)
    pts2 = np.float32([[0, 0], [w, 0], [0, h], [w, h]])
    matrix = cv2.getPerspectiveTransform(pts1, pts2)
    imgWarp = cv2.warpPerspective(img, matrix, (w, h))
    imgWarp = imgWarp[pad:imgWarp.shape[0] - pad, pad:imgWarp.shape[1] - pad]
    return imgWarp
 
 
def findDis(pts1, pts2):
    return ((pts2[0] - pts1[0]) ** 2 + (pts2[1] - pts1[1]) ** 2) ** 0.5

接下來(lái),我將按照慣例講解,我們就以每個(gè)函數(shù)的意義來(lái)講。

1.getContours()函數(shù),曾在我以前的博客中出現(xiàn)過(guò)。正如它的命名,我們是為了得到輪廓。將原始圖像依次經(jīng)過(guò)這些轉(zhuǎn)化:灰度圖像、高斯模糊、canny檢測(cè)邊緣、膨脹、侵蝕等。 cv2.findContours()從圖像ROI中提取輪廓,然后在整個(gè)圖像上下文中分析輪廓,參數(shù)cv2.RETR_EXTERNAL將會(huì)獲取外部邊緣;                    

cv2.contourArea()計(jì)算輪廓面積;

cv2.contourArea()計(jì)算輪廓周長(zhǎng)或曲線長(zhǎng)度;

cv2.approxPolyDP()以指定精度近似多邊形曲線;

cv2.boundingRect()函數(shù)計(jì)算并返回指定點(diǎn)集或灰度圖像非零像素的最小右上邊界矩形;

之后用finalCountours這個(gè)空列表來(lái)接受我們需要用到的信息,再對(duì)其輪廓的大小進(jìn)行排序,因?yàn)槲覀冃枰氖亲畲蟮倪吔缈颉?                                                   

cv2.drawContours()繪制輪廓輪廓或填充輪廓,最后返回img, finalCountours。

2.reorder函數(shù),myPointsNew = np.zeros_like(myPoints),返回與myPoints具有相同形狀和類型的零數(shù)組,在打印了myPoints.shape,它所返回的值是(4,1,2),不難理解,4指的是四個(gè)點(diǎn),2指的是x,y,我們不需要中間的1,所以要對(duì)其進(jìn)行重塑。np.argmin返回沿軸的最小值的索引,np.argmax返回沿軸的最大值的索引。所以此函數(shù)的作用是將順序改為最下面的順序。

4.warpImg()函數(shù),其實(shí)就是透視變換,詳細(xì)的函數(shù)可以回頭復(fù)習(xí)一下Opencv的文檔,我在此不做多的講述。

5.findDis()函數(shù)我們用一張圖來(lái)解釋,個(gè)人手繪:

5、項(xiàng)目代碼展示與講解

import cv2
import utils
 
###################################
webcam = False
path = '1.png'
cap = cv2.VideoCapture(1)
cap.set(10, 160)
cap.set(3, 1920)
cap.set(4, 1080)
scale = 3
wP = 210 * scale
hP = 297 * scale
###################################
 
while True:
    if webcam:
        success, img = cap.read()
    else:
        img = cv2.imread(path)
 
    imgContours, conts = utils.getContours(img, minArea=50000, filter=4)
    if len(conts) != 0:
        biggest = conts[0][2]
        # print(biggest)
        imgWarp = utils.warpImg(img, biggest, wP, hP)
        imgContours2, conts2 = utils.getContours(imgWarp,
                                                 minArea=2000, filter=4,
                                                 cThr=[50, 50], draw=False)
        if len(conts) != 0:
            for obj in conts2:
                cv2.polylines(imgContours2, [obj[2]], True, (0, 255, 0), 2)
                nPoints = utils.reorder(obj[2])
                nW = round((utils.findDis(nPoints[0][0] // scale, nPoints[1][0] // scale) / 10), 1)
                nH = round((utils.findDis(nPoints[0][0] // scale, nPoints[2][0] // scale) / 10), 1)
                cv2.arrowedLine(imgContours2, (nPoints[0][0][0], nPoints[0][0][1]),
                                (nPoints[1][0][0], nPoints[1][0][1]),
                                (255, 0, 255), 3, 8, 0, 0.05)
                cv2.arrowedLine(imgContours2, (nPoints[0][0][0], nPoints[0][0][1]),
                                (nPoints[2][0][0], nPoints[2][0][1]),
                                (255, 0, 255), 3, 8, 0, 0.05)
                x, y, w, h = obj[3]
                cv2.putText(imgContours2, '{}cm'.format(nW), (x + 30, y - 10), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.5,
                            (255, 0, 255), 2)
                cv2.putText(imgContours2, '{}cm'.format(nH), (x - 70, y + h // 2), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.5,
                            (255, 0, 255), 2)
        cv2.imshow('A4', imgContours2)
 
    img = cv2.resize(img, (0, 0), None, 0.5, 0.5)
    cv2.imshow('Original', img)
    if cv2.waitKey(1) & 0xFF ==27:
        break

那么,本項(xiàng)目的代碼我看了一下,將utils.py文件看懂之后,不難理解,所以本項(xiàng)目我就不仔細(xì)講解了。

6、項(xiàng)目資源

GitHub

7、項(xiàng)目總結(jié)

本項(xiàng)目主要是運(yùn)用了之前掃描文檔的思想,以A4紙為背景,檢測(cè)其中區(qū)域的物體長(zhǎng)和寬。我的攝像頭無(wú)法固定,所以是手持的,且由于我在寢室里面是真的沒(méi)有找到合適的測(cè)量物體以及背景色(全是米色或原木色的)。所以效果有所欠缺,但經(jīng)過(guò)ps修改的圖片,檢測(cè)的效果還是很不錯(cuò)的。

以上就是Python+Opencv實(shí)現(xiàn)物體尺寸測(cè)量的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python Opencv物體尺寸測(cè)量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬取國(guó)外天氣預(yù)報(bào)網(wǎng)站的方法

    Python爬取國(guó)外天氣預(yù)報(bào)網(wǎng)站的方法

    這篇文章主要介紹了Python爬取國(guó)外天氣預(yù)報(bào)網(wǎng)站的方法,可實(shí)現(xiàn)抓取國(guó)外天氣預(yù)報(bào)信息的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 使用Django框架中ORM系統(tǒng)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查

    使用Django框架中ORM系統(tǒng)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查

    這篇文章主要介紹了使用Django的ORM實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查方法,文中附含詳細(xì)示例代碼以及過(guò)程詳解,有需要的朋友可以借鑒參考下
    2021-09-09
  • Python調(diào)用JAR包的類和方法詳細(xì)指南

    Python調(diào)用JAR包的類和方法詳細(xì)指南

    .jar(Java ARchive,Java歸檔)文件:一種用于分發(fā) Java 類文件(.class 文件)、Java 應(yīng)用程序和相關(guān)資源(如:圖像、音頻文件、配置文件等)的文件格式,本文給大家介紹了Python調(diào)用JAR包的類和方法詳細(xì)指南,需要的朋友可以參考下
    2025-04-04
  • Python中JSON的使用方法(超詳細(xì))

    Python中JSON的使用方法(超詳細(xì))

    JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,它是JavaScript的子集,易于人閱讀和編寫,這篇文章主要介紹了Python中JSON的基本使用,需要的朋友可以參考下
    2022-11-11
  • Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作

    Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作

    這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 詳解Python IO口多路復(fù)用

    詳解Python IO口多路復(fù)用

    這篇文章主要介紹了Python IO口多路復(fù)用的的相關(guān)資料,文中講解的非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • 利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式

    利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式

    今天小編就為大家分享一篇利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Windows64x下VScode下載過(guò)程

    Windows64x下VScode下載過(guò)程

    這篇文章主要介紹了Windows64x下VScode下載,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Python文件名的匹配之clob庫(kù)

    Python文件名的匹配之clob庫(kù)

    這篇文章主要介紹了Python文件名的匹配之clob庫(kù),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助喲,需要的朋友可以參考下
    2021-05-05
  • 詳解使用CUDA+OpenCV加速yolo v4性能

    詳解使用CUDA+OpenCV加速yolo v4性能

    這篇文章主要介紹了使用CUDA+OpenCV加速yolo v4性能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

容城县| 荣昌县| 湖州市| 阳西县| 蕲春县| 江源县| 铁岭县| 临洮县| 张家界市| 兴和县| 祁门县| 古交市| 普洱| 大同市| 尼勒克县| 柘城县| 盖州市| 重庆市| 宁城县| 柞水县| 苍梧县| 滁州市| 徐汇区| 海安县| 房产| 靖宇县| 望城县| 吴川市| 金川县| 安阳县| 稻城县| 宜昌市| 扎鲁特旗| 汾阳市| 绵竹市| 江川县| 永城市| 丹阳市| 微山县| 阳山县| 重庆市|