之前的博客寫了一篇,從影像上通過滑鼠點擊獲取坐標區域,并填充顏色,

如果需要我們選擇的區域繼續劃分成不同區域,是不是能檢測更多內容,比如那一塊區域通過的人數最多,
先來回顧之前的代碼
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)
現在我們的坐標區域只選擇4個坐標點為研究物件,分別劃分不同區域
比如我現在劃分成一行3列

選擇4個坐標點之后,再將坐標區域劃分成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)
l0 = (c[2][0] - c[1][0]) // 3 #用于加橫向距離使用
l1 = (c[3][0] - c[0][0])//3 #用于加橫向距離使用
l2 = (c[2][1] - c[1][1])//3 #用于加縱向距離使用
l3 = (c[3][1] - c[0][1])//3 #用于加縱向距離使用
d = [] #用于存放劃分的每部磁區域
d.append([[c[0][0],c[0][1]],[c[1][0],c[1][1]],[c[1][0]+l0,c[1][1]+l2],[c[0][0]+l1,c[0][1]+l3]])
d.append([[c[0][0]+l1,c[0][1]+l3],[c[1][0]+l0,c[1][1]+l2],[c[1][0]+l0+l0,c[1][1]+l2+l2],[c[0][0]+l1+l1,c[0][1]+l3+l3]])
d.append([[c[0][0]+l1+l1,c[0][1]+l3+l3],[c[1][0]+l0+l0,c[1][1]+l2+l2], [c[2][0],c[2][1]],[c[3][0],c[3][1]]])
print(d) #獲得橫向分成3等分的區域
if len(c) < 3:
print('請重新運行,并點擊3個以上坐標……')
else:
h, w = img.shape[:2] # #顯示獲取讀取進來的圖片長寬
mask = np.zeros((h, w), dtype=np.uint8) # 創建一個等影像大小的全黑背景
fill_img2 = mask
for i in range(0,3):
ndarray_pts = np.array(d[i], np.int32) # 將坐標陣列轉化成矩陣
fill_img = cv2.fillPoly(mask, [ndarray_pts], color=i+1) # 對所在區域進行填充顏色,引數二為上面獲得的坐標矩陣, 引數3為填充顏色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三維的維度
fill_img = np.array(fill_img * [50, 100, 150]//3, np.uint8) # 轉化3維矩陣
fill_img2 = cv2.add(img2, fill_img) # 將兩個圖片像素相加
cv2.imshow("image2", fill_img2)
cv2.imwrite('1.jpg', fill_img2)
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/293862.html
標籤:AI
上一篇:【機器學習】特征工程
