[python opencv 計算機視覺零基礎到實戰] 十八、用鼠標進行畫畫

一、學習目標

  1. 了解如何在圖片中加入文字
  2. 了解如何使用鼠標進行圖像繪制

二、了解如何通過鼠標進行圖像繪制

2.1 了解putText方法的使用

putText方法接收圖像,文字內容, 坐標 ,字體,大小,顏色,字體厚度這幾個參數,我們用中文的函數原型說明如下:

putText(圖像,文字內容, 坐標 ,字體,大小,顏色,字體厚度)

我們可以首先自定義一張純黑圖片,代碼如下:

import cv2
import numpy as npimg=np.zeros((800,800,3), np.uint8)

隨后定義一個字體:

font = cv2.FONT_HERSHEY_SIMPLEX

以上是一個黑色簡體,并且賦值到font變量中。接著我們使用putText參數,使用putText參數傳入,代碼如下:

cv2.putText(img,'Blog 1_bit @ebaina @csdn',(0,300), font,1,(255,255,255),1)

以上代碼使用了putText方法,傳入了img參數,為所需要繪制的圖像,第二個參數為需要顯示的內容,第三個是顯示的其實坐標為(0,300),font表示為字體,1表示為字體的大小,(255,255,255)為字體的顏色,1為字體的厚度。我們接下來查看一下顯示效果如何,完整代碼如下:

import cv2
import numpy as npimg=np.zeros((800,800,3), np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Blog 1_bit @ebaina @csdn',(0,300), font,1,(255,255,255),1)
cv2.imshow("Image", img)
cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:
我們可以移動其實坐標查看繪制效果,例如改成100,300,結果如下:

更改字體大小以及更改字體厚度為2:

相比來說在圖片上繪制顏色還是比較簡單的。
我們也可以通過繪制出好看的圖片文字,例如:

這種圖片繪制起來很簡單,只需要添加一個for循環并且每次改變顏色和大小就可以完成,首先我們引入隨機庫;

import random

隨后定義一個字體大小變量以及bgr三通道的變量值:

fsize=2
b,g,r=255,255,255

接下來使用一個for循環,每次循環都改變大小以及bgr三通道值:

fsize+=0.05
b=random.uniform(0,255)
g=random.uniform(0,255)
r=random.uniform(0,255)

所有的完整代碼如下:

import cv2
import numpy as np
import randomimg=np.zeros((800,800,3), np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEXfsize=2
b,g,r=255,255,255
for i in range(5):fsize+=0.05b=random.uniform(0,255)g=random.uniform(0,255)r=random.uniform(0,255)cv2.putText(img,'Blog 1_bit',(100,300), font,fsize,(b,g,r),2)
cv2.imshow("Image", img)
cv2.waitKey (0)
cv2.destroyAllWindows()

這樣就繪制出來了這種略帶動感的圖片,其實可以通過圖片位置的不同變化讓文字顯示的更有梯度和層次。如改變x的值,每次使這個x坐標值向右移動,大小不變,代碼如下:

xpoint=100
for i in range(5):b=random.uniform(0,255)g=random.uniform(0,255)r=random.uniform(0,255)xpoint+=1cv2.putText(img,'Blog 1_bit',(xpoint,300), font,2,(b,g,r),2)

結果如下:
再或者移動x軸,同理可得,不再贅述代碼,結果如下:
這些效果都是可以移動上下左右坐標去進行位置的變換,從而達到不一樣的肉眼視覺效果。

2.2 了解setMouseCallback方法的使用

其實setMouseCallback方法就是一個鼠標的回調函數,這個函數涉及到事件這個概念。我們可以把事件理解成一種響應觸發,例如小明吃蘋果時、小麗喝奶茶時、小楊唱歌時;這些事件可以有一個對應的動作進行處理。例如小明吃蘋果時他會開心地手舞足蹈、小麗喝奶茶時會吐掉珍珠、小楊唱歌時他的舍友會說他唱的難聽,這些事件觸發了之后的響應。

setMouseCallback方法就是一個鼠標的事件回調函數。在我們在圖片上進行雙擊時,我們若想在雙擊點進行繪制一個圓形,這個時候就需要這個setMouseCallback方法。

setMouseCallback方法接收兩個參數,一個是要顯示的窗口名稱,還有一個是響應的處理函數。

首先我們創建一個窗口和一張圖片:

img=np.zeros((800,800,3), np.uint8)
cv2.namedWindow('image')

隨后使用setMouseCallback方法響應我們的鼠標事件:

cv2.setMouseCallback('image',draw_circle)

以上傳入的第一個參數是image,表示窗口名為image,第二個參數是一個方法名,當我們鼠標進行操作后,我們需要一個函數對這個操作進行后續的響應。這個函數是需要進行創建的,我們可以創建出來,并且需要傳入指定的參數:

def draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),10,(255,0,0),1)

以上函數draw_circle中參數event會直接被setMouseCallback函數進行值的傳遞x,y,flags,param也是如此。我們先看event,event是表示你的鼠標進行了那些操作,例如event==cv2.EVENT_LBUTTONDBLCLK就表示判斷event是否進行了雙擊事件;x與y是當前事件點的鼠標x與y坐標。
在draw_circle函數中,使用if語句判斷了事件是否是雙擊事件,如果是,那么就繪制一個圓,圓中心就在雙擊的x與y坐標處。
最后使用循環以及顯示圖片顯示內容,完整代碼如下:

import cv2
import numpy as npdef draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),10,(255,0,0),1)img=np.zeros((800,800,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):cv2.imshow('image',img)if cv2.waitKey(20)&0xFF==27:break
cv2.destroyAllWindows()

為什么不把setMouseCallback放到循環當中?那是因為以及指定了窗口名后就會使這個監聽生效于這個窗口之中。運行結果如下:

該系列首發于ebaina

三、總結

  1. 了解在圖片中加入文字使用putText方法,并且可以通過位移或者改變大小、顏色增加字體的觀感效果
  2. 了解使用鼠標進行圖像繪制使用setMouseCallback方法,并且了解了事件是什么

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287471.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287471.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287471.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【測繪程序設計】坐標正算神器V1.0(附C/C#/VB源程序)

坐標正算,就是根據直線的邊長、坐標方位角和一個端點的坐標,計算直線另一個端點的坐標的工作。本文用C#語言和VB語言實現坐標正算,編寫坐標正算神器。 計算實例: 實例1,設直線AB的邊長DAB和一個端點A的坐標XA、YA為已知,則直線另一個端點B的坐標為: XB=XA+ΔXAB YB=YA+…

2.2 PostgreSQL 概念

PostgreSQL 是一種關系型數據庫管理系統(RDBMS)。這意味著它是一種用于管理那些以關系形式存儲數據的系統。關系實際上是表的數學稱呼。今天,把數據存儲在表里的概念已經快成固有的常識了,但是還有其它一些方法用于組織數據庫。在類 Unix 操作系統上的文…

Blazor University (22)路由 —— 定義路由

原文鏈接:https://blazor-university.com/routing/路由與標準 ASP.NET MVC 一樣,Blazor 路由是一種用于檢查瀏覽器 URL 并將其匹配到要呈現的頁面的技術。路由比簡單地將 URL 匹配到頁面更靈活。它允許我們根據文本模式進行匹配,例如&#xf…

Linux文件I/O編程(二)lseek函數

文件I/O編程處理open、read、write、close,等必要函數對文件進行讀寫操作外,lseek、fcntl也是I/O編程很重要的函數。lseek函數lseek函數主要用來移動當前讀寫位置,第一個參數是文件描述符fd,第二個參數是偏移距離,第三…

[python opencv 計算機視覺零基礎到實戰] 十九、簡易繪畫板制作

一、學習目標 了解事件編寫一個簡易繪畫板 二、了解如何制作簡易繪畫板 2.1 了解鼠標多種事件 上一節我們簡單的使用opencv的圖形繪制方法,用鼠標繪制了一些內容。上一節所響應的是簡單的雙擊事件EVENT_LBUTTONDBLCLK,在OpenCV的鼠標事件中還有很多。…

Web App 和 Native App,哪個是趨勢?

2019獨角獸企業重金招聘Python工程師標準>>> Web App 和 Native App,哪個是趨勢? https://www.zhihu.com/question/19558750 WebAPP與原生APP的交互設計區別 http://www.woshipm.com/ucd/132869.html Web App 開發使用哪種框架比較好&#xf…

基于天地圖的應用服務系統設計開發—以甘肅高校招生服務為例

“天地圖”是國家測繪地理信息局建設的地理信息綜合服務網站。它是“數字中國”的重要組成部分,是國家地理信息公共服務平臺的公眾版。“天地圖”的目的在于促進地理信息資源共享和高效利用,提高測繪地理信息公共服務能力和水平,改進測繪地理信息成果的服務方式,更好地滿足…

查缺補漏系統學習 EF Core 6 - 修改實體數據

推薦關注「碼俠江湖」加星標,時刻不忘江湖事這是 EF Core 系列的第六篇文章,上一篇文章講述了 EF Core 中的原始 SQL 語句查詢。這篇文章講一講 EF Core 如何修改實體數據。點擊上方或后方藍字,閱讀 EF Core 系列合集。實體狀態在開始學習 EF…

在AngularJS的controller外部直接獲取$scope

為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/SJQ。 http://www.cnblogs.com/shijiaqi1066/p/5560843.html 以前利用webqq的寫過一個自動發消息的腳本,由于那時webqq還直接使用類似jQuery操作DOM的技術&#x…

js pug 代碼_pug模版學習(一)

標簽按照html的縮進格式doctype htmlhtmlheadtitlebody編譯結果:文本p 這是文本| 這是文本p.這是文本編譯結果:這是文本這是文本這是文本屬性設置class名跟id名(默認是div)p.foop#foop#foo.foo.foo#foo編譯結果:其他屬性:a(href&q…

Upgrade Hole puncher Mathematical Modeling

// AntColony.cpp : 定義控制臺應用程序的入口點。 //#include<iostream> #include<math.h> #include<time.h> #include<stdio.h> #include <fstream> #include <string> #include <iostream> #include <vector>using n…

Android之提示Cannot call this method while RecyclerView is computing a layout or scrolling

1 問題 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView{24d6f3b VFED.V... ......ID 0,657-1074,1911 #7f090143 app:id/recyclerView}, adapter:com.appsinno…

Java8新的異步編程方式 CompletableFuture(三)

前面兩篇文章已經整理了CompletableFuture大部分的特性&#xff0c;本文會整理完CompletableFuture余下的特性&#xff0c;以及將它跟RxJava進行比較。 3.6 Either Either 表示的是兩個CompletableFuture&#xff0c;當其中任意一個CompletableFuture計算完成的時候就會執行。 …

情人節,我表白了CSDN小姐姐后,竟然...【為表白寫了一個繪圖工具,讓我不再手殘】

情人節&#xff0c;我表白了CSDN小姐姐后&#xff0c;竟然…竟然有人看了這篇文。 以下圖片素材由一個還沒寫完的工具繪制&#xff0c;稍后會放在CSDN的代碼倉庫&#xff08;現在能用了&#xff0c;還沒時間改&#xff0c;顏色填充算法還沒寫&#xff0c;有能力的朋友可以修改一…

【小程序】劉一哥課堂隨機點名提問神器V1.0(附源程序)

為了能讓我們的孩子們盡量來教室上課,增強課堂的參與度,激發課堂激情,提高學習效率,一哥也是煞費苦心,于是開發出了這么一款課堂點名提問神器,跟大家分享一下。 打開神器,看到的界面是這樣子的,我很感激有勇氣按時起床并能到教室的每一位有志之士。 點擊【開始】按鈕,…

org.hibernate.HibernateException: No Session found for current thread

spring、springmvc和hibernate整合 在sessionFactory.getCurrentSession()時&#xff0c;出現以下異常 No Session found for current thread但使用sessionFactory.openSession()是沒有任何問題的 嚴重: Servlet.service() for servlet [springDispatcherServlet] in context w…

java mysbatis select_MyBatis SELECT基本查詢實現方法詳解

1、返回一個LISTselect * from tbl_employee where last_name like #{lastName}2、將查詢記錄封裝為一個Mapselect * from tbl_employee where id#{id}返回一條記錄的map&#xff1b;key就是列名&#xff0c;值就是對應的值。3、多條記錄封裝為一個mapMapKey("id")pu…

Git之怎么通過命令修改前面幾次提交的記錄

1 問題 我們平時用gitlab,github發現提交代碼上庫記錄寫錯了&#xff0c;需要修改回來。 2 解決辦法

Git客戶端TortoiseGit(Windows系統)的使用方法

本文環境&#xff1a; 操作系統&#xff1a;Windows XP SP3 Git客戶端&#xff1a;TortoiseGit-1.8.8.0-32bit 一、安裝Git客戶端 全部安裝均采用默認&#xff01; 1. 安裝支撐軟件 msysgit: https://code.google.com/p/msysgit/downloads/list?qfullinstallerofficialgit 當前…