實驗6 Python OpenCV寬度測量

2022-07-30 06:12:11 字數 4534 閱讀 8594

your browser does not support the audio element.

測量所給的高度,即上下邊緣間的距離。

思路:

將進行閾值操作得到二值化。

擷取只包含上下邊框的部分,以便於後續的輪廓提取

輪廓檢測

得到結果

1.用於給新增中文字元

#用於給新增中文字元

def imgtext_cn(img, text, left, top, textcolor=(0, 255, 0), textsize=20):

if (isinstance(img, np.ndarray)): #判斷是否為opencv型別

img = image.fromarray(cv2.cvtcolor(img, cv2.color_bgr2rgb))

draw = imagedraw.draw(img)

fonttext = imagefont.truetype(r'c:\windows\fonts\simsun.ttc', textsize, encoding="utf-8") ##中文字型

draw.text((left, top), text, textcolor, font=fonttext) #寫文字

return cv2.cvtcolor(np.asarray(img), cv2.color_rgb2bgr)

2.實現反色功能
#實現反色功能

def pointinvert(img):

height, width = img.shape #獲取尺寸

for i in range(height):

for j in range(width):

pi = img[i, j]

img[i, j] = 255 - pi

return img

4.邊緣檢測
# canny邊緣檢測

edges = cv2.canny(th, 30, 70)

res=pointinvert(edges) #顏色反轉

#顯示cv2.imshow('original', th) #顯示二值化後的圖,主題為白色,背景為黑色 更加容易找出輪廓

key = cv2.waitkey(0)

if key==27: #按esc鍵時,關閉所有視窗

print(key)

cv2.destroyallwindows()

5.輪廓操作

cnt = contours[0] #取出輪廓

x, y, w, h = cv2.boundingrect(cnt) #用乙個矩形將輪廓包圍

img_gray = cv2.cvtcolor(res, cv2.color_gray2bgr) #將灰度轉化為彩色方便畫圖

cv2.line(img_gray, (x, y), (x + w, y), (0,0,255), 2, 5) #上邊緣

cv2.line(img_gray, (x, y+h), (x + w, y+h), (0, 0, 255), 2, 5) #下邊緣

img1[80:230, 90:230] = img_gray #用帶有上下輪廓的圖替換掉原圖的對應部分

6.顯示

res1=imgtext_cn(img1, '寬度%d'%h, 25, 25, textcolor=(0, 255, 0), textsize=30)    #繪製文字

#顯示

cv2.imshow('original', res1)

key = cv2.waitkey(0)

if key==27: #按esc鍵時,關閉所有視窗

print(key)

cv2.destroyallwindows()

7.完整**
import cv2

import numpy as np

from pil import image, imagedraw, imagefont

#用於給新增中文字元

def imgtext_cn(img, text, left, top, textcolor=(0, 255, 0), textsize=20):

if (isinstance(img, np.ndarray)): #判斷是否為opencv型別

img = image.fromarray(cv2.cvtcolor(img, cv2.color_bgr2rgb))

draw = imagedraw.draw(img)

fonttext = imagefont.truetype(r'c:\windows\fonts\simsun.ttc', textsize, encoding="utf-8") ##中文字型

draw.text((left, top), text, textcolor, font=fonttext) #寫文字

return cv2.cvtcolor(np.asarray(img), cv2.color_rgb2bgr)

#實現反色功能

def pointinvert(img):

height, width = img.shape #獲取尺寸

for i in range(height):

for j in range(width):

pi = img[i, j]

img[i, j] = 255 - pi

return img

img=cv2.imread("gongjian1.bmp",0) #載入彩色圖

img1=cv2.imread("gongjian1.bmp",1) #載入灰度圖

recimg = img[80:230, 90:230] #擷取需要的部分

img2 = img1[80:230, 90:230] #擷取需要的部分

ret, th = cv2.threshold(recimg, 90, 255, cv2.thresh_binary) #閾值操作二值化

# canny邊緣檢測

edges = cv2.canny(th, 30, 70)

res=pointinvert(edges) #顏色反轉

#顯示cv2.imshow('original', th) #顯示二值化後的圖,主題為白色,背景為黑色 更加容易找出輪廓

key = cv2.waitkey(0)

if key==27: #按esc鍵時,關閉所有視窗

print(key)

cv2.destroyallwindows()

cnt = contours[0] #取出輪廓

x, y, w, h = cv2.boundingrect(cnt) #用乙個矩形將輪廓包圍

img_gray = cv2.cvtcolor(res, cv2.color_gray2bgr) #將灰度轉化為彩色方便畫圖

cv2.line(img_gray, (x, y), (x + w, y), (0,0,255), 2, 5) #上邊緣

cv2.line(img_gray, (x, y+h), (x + w, y+h), (0, 0, 255), 2, 5) #下邊緣

img1[80:230, 90:230] = img_gray #用帶有上下輪廓的圖替換掉原圖的對應部分

res1=imgtext_cn(img1, '寬度%d'%h, 25, 25, textcolor=(0, 255, 0), textsize=30) #繪製文字

#顯示

cv2.imshow('original', res1)

key = cv2.waitkey(0)

if key==27: #按esc鍵時,關閉所有視窗

紅色輪廓沒有顯示,解決方案:將灰度圖轉化為彩色圖

學習了opencv的寬度測量,遇到了作業問題自己解決了,鍛鍊了自己的能力。

Python OpenCV教程6 閾值分割

固定閾值分割很直接,一句話說就是畫素點值大於閾值乙個值,小於閾值是另外乙個值。灰度圖讀入 閾值分割 ret,th cv2.threshold img,127,255,cv2.thresh binary cv2.imshow thresh th cv2.waitkey 0 cv2.threshold ...

實驗6總結

1.函式概述 2.函式的功能 3.函式使用說明 4.函式分類 1 庫函式 標準函式 是系統提供定義,使用者程式設計時可直接呼叫。printf scanf 2 使用者定義函式 是使用者自己編寫的用來解決具體問題的函式。cylinder max printstar 1 無參函式 不需要向函式傳遞引數。p...

6 輸入捕獲實驗

注意點 1 在學習的過程中我們使用到與串列埠實驗相類似的乙個暫存器 本質是乙個變數 用來處理不同的情況,在今後的學習也可以使用這種方法,這種暫存器的組成如下圖所示 2 確定捕獲到乙個完整高電平的軟體實現 包括如果處理接收到的高電平持續時間過長的情況 void tim2 irqhandler void...