我們在作業中總會遇到一些需要獲取坐標的方式,來對影像進行處理填充色彩,
但是直接輸入坐標,往往不是自己的想要的位置,所以需要不斷的調整填入的坐標,
如果能直接在圖片上點擊需要的點,是不是也很方便,
點擊獲取坐標

還是這張圖片,老演員了
現在圖片上隨機點幾個點

結果顯示無誤,代碼如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加載本地的影像
a = [] #用于存放橫坐標
b = [] #用于存放縱坐標
#定義點擊事件
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #如果存在滑鼠點擊事件
xy = "%d,%d" % (x, y) #得到坐標x,y
a.append(x) #將每次的坐標存放在a陣列里面
b.append(y) #將每次的坐標存放在b陣列里面
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) #點擊的地方小紅圓點顯示
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, #點擊的地方顯示坐標數字 引數1圖片,引數2添加的文字,引數3左上角坐標,引數4字體,引數5字體粗細
1.0, (0, 0, 0), thickness=1)
cv2.imshow("image", img) #顯示圖片
cv2.namedWindow("image") #定義圖片視窗
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) #回呼函式,引數1視窗的名字,引數2滑鼠回應函式
cv2.imshow("image", img) #顯示圖片
cv2.waitKey(0) #不斷重繪影像
c = [] #用于存放所有坐標
for i in range(0,len(a)):
print(a[i], b[i]) # 列印坐標
c.append([a[i], b[i]])
print(c)
以上就是點擊獲取坐標,看其他來還是非常好用,
接下來就是對坐標所在區域進行填充顏色
坐標區域填色
根據剛剛的三個坐標即可得到

代碼如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加載本地的影像
c = [[101,134],[198,133],[165,174]]
# #顯示獲取讀取進來的圖片長寬
h, w = img.shape[:2]
mask = np.zeros((h, w), dtype=np.uint8) #創建一個等影像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 將坐標陣列轉化成矩陣
fill_img = cv2.fillPoly(mask, [ndarray_pts], (255,0,0)) #對所在區域進行填充顏色,引數二為上面獲得的坐標矩陣, 引數3為填充顏色
cv2.imshow("image2", fill_img)
cv2.waitKey(0)
當然我們需要的是能將填充區域在原圖上顯示,那么

代碼如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加載本地的影像
c = [[101,134],[198,133],[165,174]]
# #顯示獲取讀取進來的圖片長寬
h, w = img.shape[:2]
mask = np.zeros((h, w), dtype=np.uint8) #創建一個等影像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 將坐標陣列轉化成矩陣
fill_img = cv2.fillPoly(mask, [ndarray_pts], (255,0,0)) #對所在區域進行填充顏色,引數二為上面獲得的坐標矩陣, 引數3為填充顏色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三維的維度
fill_img = np.array(fill_img * [1, 1, 1], np.uint8) #轉化3維矩陣
fill_img = cv2.add(img, fill_img) #將兩個圖片進行像素相加
cv2.imshow("image2", fill_img)
cv2.waitKey(0)
完整代碼如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加載本地的影像
a = [] #用于存放橫坐標
b = [] #用于存放縱坐標
print('請隨意點擊3個以上坐標:')
#定義點擊事件
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #如果存在滑鼠點擊事件
xy = "%d,%d" % (x, y) #得到坐標x,y
a.append(x) #將每次的坐標存放在a陣列里面
b.append(y) #將每次的坐標存放在b陣列里面
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) #點擊的地方小紅圓點顯示
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, #點擊的地方顯示坐標數字 引數1圖片,引數2添加的文字,引數3左上角坐標,引數4字體,引數5字體粗細
1.0, (0, 0, 0), thickness=1)
cv2.imshow("image", img) #顯示圖片
cv2.namedWindow("image") #定義圖片視窗
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) #回呼函式,引數1視窗的名字,引數2滑鼠回應函式
cv2.imshow("image", img) #顯示圖片
cv2.waitKey(0)
c = [] #用于存放所有坐標
for i in range(0,len(a)):
print(a[i], b[i]) # 列印坐標
c.append([a[i], b[i]])
print(c)
if len(c)<3:
print('請重新運行,并點擊3個以上坐標……')
else:
h, w = img.shape[:2] # #顯示獲取讀取進來的圖片長寬
mask = np.zeros((h, w), dtype=np.uint8) #創建一個等影像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 將坐標陣列轉化成矩陣
fill_img = cv2.fillPoly(mask, [ndarray_pts], color = 1) #對所在區域進行填充顏色,引數二為上面獲得的坐標矩陣, 引數3為填充顏色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三維的維度
fill_img = np.array(fill_img * [255, 255, 255], np.uint8) #轉化3維矩陣
fill_img = cv2.add(img, fill_img) #將兩個圖片像素相加
cv2.imshow("image2", fill_img)
cv2.waitKey(0)

當點擊3個以上坐標,可得到如上圖所示的效果,如果點擊坐標不足3個及以上,則提示重新運行

如果想結果沒有坐標顯示,可以運行以下代碼:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加載本地的影像
img2 = img.copy()
a = [] #用于存放橫坐標
b = [] #用于存放縱坐標
print('請隨意點擊3個以上坐標:')
#定義點擊事件
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #如果存在滑鼠點擊事件
xy = "%d,%d" % (x, y) #得到坐標x,y
a.append(x) #將每次的坐標存放在a陣列里面
b.append(y) #將每次的坐標存放在b陣列里面
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) #點擊的地方小紅圓點顯示
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, #點擊的地方顯示坐標數字 引數1圖片,引數2添加的文字,引數3左上角坐標,引數4字體,引數5字體粗細
1.0, (0, 0, 0), thickness=1)
cv2.imshow("image", img) #顯示圖片
cv2.namedWindow("image") #定義圖片視窗
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) #回呼函式,引數1視窗的名字,引數2滑鼠回應函式
cv2.imshow("image", img) #顯示圖片
cv2.waitKey(0)
c = [] #用于存放所有坐標
for i in range(0,len(a)):
print(a[i], b[i]) # 列印坐標
c.append([a[i], b[i]])
print(c)
if len(c)<3:
print('請重新運行,并點擊3個以上坐標……')
else:
h, w = img.shape[:2] # #顯示獲取讀取進來的圖片長寬
mask = np.zeros((h, w), dtype=np.uint8) #創建一個等影像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 將坐標陣列轉化成矩陣
fill_img = cv2.fillPoly(mask, [ndarray_pts], color = 1) #對所在區域進行填充顏色,引數二為上面獲得的坐標矩陣, 引數3為填充顏色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三維的維度
fill_img = np.array(fill_img * [255, 255, 255], np.uint8) #轉化3維矩陣
fill_img = cv2.add(img2, fill_img) #將兩個圖片像素相加
cv2.imshow("image2", fill_img)
cv2.imwrite('1.jpg',fill_img)
cv2.waitKey(0)

當然我們在運行的時候很可能會遇到opencv報錯的問題
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-z4706ql7\opencv\modules\highgui\src\window.cpp:1274: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
遇到這種報錯,這個估計是版本沒下載好,刪了重來
pip uninstall opencv-python
pip3 install opencv-contrib-python
當然報錯還有可能是路徑帶有中文或空格有時也會報錯,
還有的保存是函式的版本不同,老版本回傳的是三個引數,新版本卻只有兩個引數
比如
contours,heriachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
那么本期博客就寫到這里,
記得點贊關注加收藏,多支持博主,才能有動力日更不斷!!!
有需要寫代碼 和修改代碼的可以聯系我的扣扣:334542894
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293443.html
標籤:其他
上一篇:基于STM32設計的掌上游戲機(運行NES游戲模擬器)詳細開發程序
下一篇:2021-08-11
