0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣在樹莓派上使用OpenCV構建簡單的繪圖應用程序

454398 ? 來源:工程師吳畏 ? 2019-07-26 11:30 ? 次閱讀

該應用程序將有四個軌道欄:三個將用于更改顏色(B,G,R),第四個將用于選擇在矩形,圓形,直線或自由線之間。

也可以將軌跡欄用作開關。默認情況下,OpenCV沒有按鈕功能,但我們可以將軌跡欄用作按鈕。

我們可以在這個應用程序中使用的另一個有用的功能是鼠標回調函數(shù),它將在鼠標事件發(fā)生時執(zhí)行。

我們可以使用不同的形狀使用我們的OpenCV繪圖應用程序繪制。

Python代碼

以下是用于創(chuàng)建簡單繪畫應用程序的完整Python代碼:

import math

import cv2

def nothing(x):

pass

# Load an image

img = cv2.imread(‘obama.jpg’)

cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)

# Create trackbars for color change

cv2.createTrackbar(‘R’,‘image’,0,255,nothing)

cv2.createTrackbar(‘G’,‘image’,0,255,nothing)

cv2.createTrackbar(‘B’,‘image’,0,255,nothing)

# Create trackbars for drawing shapes

cv2.createTrackbar(‘Select’, ‘image’,0,3,nothing)

drawing = False # true if mouse is pressed

ix,iy = -1,-1

# mouse callback function

def draw(event,x,y,flags,param):

global ix,iy,drawing

if event == cv2.EVENT_LBUTTONDOWN:

drawing = True

ix,iy = x,y

elif event == cv2.EVENT_MOUSEMOVE:

if drawing == True:

if s == 3:

cv2.circle(img,(x,y),5,(b, g, r),-1)

elif event == cv2.EVENT_LBUTTONUP:

if drawing == True:

if s == 0:

cv2.rectangle(img,(ix,iy),(x,y),(b, g, r),5)

elif s == 1:

cv2.circle(img,(int((ix+x)/2), int((iy+y)/2)),int(math.sqrt( ((ix-x)**2)+((iy-y)**2) )),(b, g, r),5)

elif s == 2:

cv2.line(img,(ix,iy),(x,y),(b, g, r),5)

drawing = False

cv2.setMouseCallback(‘image’,draw)

while(1):

cv2.imshow(‘image’,img)

k = cv2.waitKey(1) & 0xFF

if k == 27:

break

# get current positions of four trackbars

r = cv2.getTrackbarPos(‘R’,‘image’)

g = cv2.getTrackbarPos(‘G’,‘image’)

b = cv2.getTrackbarPos(‘B’,‘image’)

s = cv2.getTrackbarPos(‘Select’,‘image’)

cv2.destroyAllWindows()

閱讀圖像

函數(shù) cv2.imread()用于讀取圖像,其參數(shù)是圖像的名稱。如果圖像在工作目錄中,只需寫入圖像的名稱。否則,您將必須提供圖像的完整路徑。

我們將創(chuàng)建一個窗口并將其標記為“圖像”。所有軌跡都將附加到此窗口。

img = cv2.imread(‘obama.jpg’)

cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)

創(chuàng)建軌跡欄

要創(chuàng)建軌跡欄,我們使用 cv2.createTrackbar()函數(shù),它有五個參數(shù):

軌跡欄名稱

它所附加的窗口名稱

默認值

最大值

回調函數(shù)(每次跟蹤欄值更改時執(zhí)行)

回調函數(shù)始終具有默認參數(shù),即軌跡欄位置。在我們的例子中,函數(shù)什么都不做,所以我們只是傳遞。

我們?yōu)榧t色,綠色和藍色創(chuàng)建了三個軌跡欄。每個軌跡欄的默認值為0,最大值為255,并將它們附加到名為“image”的窗口。

接下來我們需要創(chuàng)建一個軌跡欄,在矩形,圓形,直線之間進行選擇和自由行,默認值為0,最大值為3.我們將按如下方式設置值:

0:矩形

1:圓圈

2:直線

3:自由行

# Create trackbars for color change

cv2.createTrackbar(‘R’,‘image’,0,255,nothing)

cv2.createTrackbar(‘G’,‘image’,0,255,nothing)

cv2.createTrackbar(‘B’,‘image’,0,255,nothing)

# Create trackbars for drawing shapes

cv2.createTrackbar(‘Select’, ‘image’,0,3,nothing)

鼠標回調函數(shù)

我們現(xiàn)在可以創(chuàng)建一個鼠標回調函數(shù),該函數(shù)在發(fā)生鼠標事件時執(zhí)行。鼠標事件可以是與鼠標相關的任何事件:左鍵向下,左鍵向上,左鍵雙擊等。

該函數(shù)為我們提供每個坐標(x,y)鼠標事件。通過這個事件和位置,我們可以做任何我們喜歡的事情。

創(chuàng)建一個鼠標回調函數(shù)有一個特定的格式,在任何地方都是一樣的。它僅在功能方面有所不同。在我們的例子中,回調函數(shù)是繪制函數(shù),它將根據(jù)第四個軌跡欄的位置繪制矩形,圓形,直線或自由線。

def draw(event,x,y,flags,param):

global ix,iy,drawing

if event == cv2.EVENT_LBUTTONDOWN:

drawing = True

ix,iy = x,y

elif event == cv2.EVENT_MOUSEMOVE:

if drawing == True:

if s == 3:

cv2.circle(img,(x,y),5,(b, g, r),-1)

elif event == cv2.EVENT_LBUTTONUP:

if drawing == True:

if s == 0:

cv2.rectangle(img,(ix,iy),(x,y),(b, g, r),5)

elif s == 1:

cv2.circle(img,(int((ix+x)/2), int((iy+y)/2)),int(math.sqrt( ((ix-x)**2)+((iy-y)**2) )),(b, g, r),5)

elif s == 2:

cv2.line(img,(ix,iy),(x,y),(b, g, r),5)

drawing = False

cv2.setMouseCallback(‘image’,draw)

獲取軌跡欄位置

Cv2.getTrackbarPos()函數(shù)用于獲取軌跡欄的當前位置。它所采用的第一個參數(shù)是我們之前創(chuàng)建的軌跡欄的名稱,第二個參數(shù)是它將附加到的窗口的名稱。

# get current positions of four trackbars

r = cv2.getTrackbarPos(‘R’,‘image’)

g = cv2.getTrackbarPos(‘G’,‘image’)

b = cv2.getTrackbarPos(‘B’,‘image’)

s = cv2.getTrackbarPos(‘Select’,‘image’)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OpenCV
    +關注

    關注

    29

    文章

    622

    瀏覽量

    41091
  • 樹莓派
    +關注

    關注

    116

    文章

    1679

    瀏覽量

    105257
收藏 人收藏

    評論

    相關推薦

    樹莓派gui開發(fā)用什么ide

    樹莓派(Raspberry Pi)是一款功能強大的微型計算機,可以運行多種操作系統(tǒng),如Raspbian、Ubuntu等。樹莓派上進行GUI(圖形用戶界面)開發(fā),可以使用多種集成開發(fā)環(huán)
    的頭像 發(fā)表于 08-30 16:49 ?311次閱讀

    可以單個esp8266上安裝兩個NON OS SDK應用程序嗎?

    一個簡單的問題。我可以單個 esp8266 上安裝兩個 NON OS SDK 應用程序嗎?我的自定義引導加載程序(包括 os libs)和我的自定義
    發(fā)表于 07-19 07:28

    opencv-python和opencv一樣嗎

    -Python是OpenCV的一個Python語言接口,它允許開發(fā)者使用Python語言來調用OpenCV庫的功能。 雖然OpenCVOpenCV-Python
    的頭像 發(fā)表于 07-16 10:38 ?449次閱讀

    嵌入式學習-飛凌ElfBoard ELF 1板卡 - 如何在Ubuntu中編譯OpenCV

    之前發(fā)布的文章中探討了交叉編譯OpenCV并部署至嵌入式系統(tǒng)的方法。然而,調試階段,我們發(fā)現(xiàn)在 Ubuntu 環(huán)境下將 OpenCV 編譯為 X86 架構可能更加方便和高效。 通過
    發(fā)表于 06-07 09:21

    使用Redis和Spring?Ai構建rag應用程序

    整合如何通過簡化的開發(fā)流程,讓開發(fā)者能夠更專注于創(chuàng)新而非底層實現(xiàn)。一、SpringAI簡介由大型語言模型(LLM)驅動的應用程序中,向量數(shù)據(jù)庫常作為人工智能應用程
    的頭像 發(fā)表于 04-29 08:04 ?803次閱讀
    使用Redis和Spring?Ai<b class='flag-5'>構建</b>rag<b class='flag-5'>應用程序</b>

    應用程序中的服務器錯誤怎么解決?

    使用應用程序時,可能會遇到服務器錯誤的問題。這種錯誤通常會導致應用程序無法正常運行 ,給用戶帶來不便。下面將介紹應用程序中的服務器錯誤及其解決方法,幫助您快速解決這一問題。
    的頭像 發(fā)表于 03-12 15:13 ?4406次閱讀

    使用ADS .NET Framework構建一個應用程序,.s (匯編文件)文件無法編譯的原因?

    我正在嘗試使用 ADS .NET Framework 構建一個應用程序。 我遇到了以下錯誤,因為 .s (匯編文件)文件無法編譯。
    發(fā)表于 03-04 06:58

    u8g2應用程序無法moduStoolBox中構建是為什么?

    。 我對 ModuStoolBox 很陌生,我必須說,與 Creator 相比,學習曲線非常艱難。 不管怎樣,為了讓我的應用程序使用 ModuStoolBox 運行顯示器,我一定會很感激能在這方面得到
    發(fā)表于 01-24 07:03

    核桃派上實現(xiàn)USB攝像頭的OpenCV顏色檢測

    在前幾周的文章中已經(jīng)介紹過如何在核桃派上OpenCV讀取圖像并顯示到pyqt5的窗口上,這里在上一篇文章的基礎上,給開發(fā)板加入顏色檢測功能,嘗試將圖像中所有藍色的東西都用一個框標記出來。
    的頭像 發(fā)表于 01-20 17:50 ?808次閱讀
    <b class='flag-5'>在</b>核桃<b class='flag-5'>派上</b>實現(xiàn)USB攝像頭的<b class='flag-5'>OpenCV</b>顏色檢測

    如何構建linux開發(fā)環(huán)境和編譯軟件工程、應用程序

    前文介紹了如何使用官方提供的鏡像文件啟動開發(fā)板,本文將說明如何構建linux開發(fā)環(huán)境和編譯軟件工程、應用程序。
    的頭像 發(fā)表于 01-03 12:31 ?1525次閱讀
    如何<b class='flag-5'>構建</b>linux開發(fā)環(huán)境和編譯軟件工程、<b class='flag-5'>應用程序</b>

    開發(fā)java應用程序的基本步驟是

    ava是一種面向對象的編程語言,廣泛用于開發(fā)各種類型的應用程序開發(fā)Java應用程序時,有一些基本步驟需要遵循,以確保應用程序的正確性和可靠性。 1.確定需求:這是開發(fā)任何
    的頭像 發(fā)表于 11-28 16:52 ?1311次閱讀

    SBCFormer首次樹莓派4B上以1fps處理取得80.0%精度

    計算機視覺不同領域解決已成為解決實際問題的常用方法,如智慧農(nóng)牧管理。這類場景并不需要每秒處理許多幀,此時樹莓派這類單板主機就派上了用場。
    的頭像 發(fā)表于 11-09 12:32 ?743次閱讀
    SBCFormer首次<b class='flag-5'>在</b><b class='flag-5'>樹莓</b>派4B上以1fps處理取得80.0%精度

    Flask如何升級到 Quart 應用程序

    應用程序可以提高 3 倍的性能,而且不需要對代碼進行重大的重寫或調整。 如上所示,針對單個資源詳情的請求下,F(xiàn)lask每秒請求為330個,而quart能達到1160個。以此類推,Quart 相比于
    的頭像 發(fā)表于 11-01 16:23 ?542次閱讀
    Flask如何升級到 Quart <b class='flag-5'>應用程序</b>

    OpenCV基礎知識入門

    OpenCV是計算機視覺中最受歡迎的庫,最初由intel使用C和C ++進行開發(fā)的,現(xiàn)在也可以python中使用。該庫是一個跨平臺的開源庫,是免費使用的。OpenCV庫是一個高度優(yōu)化的庫,主要關注實時
    的頭像 發(fā)表于 10-29 11:29 ?661次閱讀
    <b class='flag-5'>OpenCV</b>基礎知識入門

    基于樹莓派的機器人設計方案

    非常低的外形安裝在樹莓派的頂部。 注意:如果你打算在樹莓派上安裝散熱器,請使用非常低調的散熱器以避免 CRICKIT 帽子短路。
    發(fā)表于 10-19 12:31 ?587次閱讀
    基于<b class='flag-5'>樹莓</b>派的機器人設計方案