Python OpenCV实现鼠标画框
生活随笔
收集整理的這篇文章主要介紹了
Python OpenCV实现鼠标画框
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python OpenCV實現鼠標畫框
使用Python+OpenCV實現鼠標畫框的代碼:
# -*-coding: utf-8 -*- """@Project: IntelligentManufacture@File : user_interaction.py@Author : panjq@E-mail : pan_jinquan@163.com@Date : 2019-02-21 15:03:18 """ # -*- coding: utf-8 -*-import cv2 from utils import image_processing import numpy as np global img global point1, point2 global g_rectdef on_mouse(event, x, y, flags, param):global img, point1, point2,g_rectimg2 = img.copy()if event == cv2.EVENT_LBUTTONDOWN: # 左鍵點擊,則在原圖打點print("1-EVENT_LBUTTONDOWN")point1 = (x, y)cv2.circle(img2, point1, 10, (0, 255, 0), 5)cv2.imshow('image', img2)elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): # 按住左鍵拖曳,畫框print("2-EVENT_FLAG_LBUTTON")cv2.rectangle(img2, point1, (x, y), (255, 0, 0), thickness=2)cv2.imshow('image', img2)elif event == cv2.EVENT_LBUTTONUP: # 左鍵釋放,顯示print("3-EVENT_LBUTTONUP")point2 = (x, y)cv2.rectangle(img2, point1, point2, (0, 0, 255), thickness=2)cv2.imshow('image', img2)if point1!=point2:min_x = min(point1[0], point2[0])min_y = min(point1[1], point2[1])width = abs(point1[0] - point2[0])height = abs(point1[1] - point2[1])g_rect=[min_x,min_y,width,height]cut_img = img[min_y:min_y + height, min_x:min_x + width]cv2.imshow('ROI', cut_img)def get_image_roi(rgb_image):'''獲得用戶ROI區域的rect=[x,y,w,h]:param rgb_image::return:'''bgr_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)global imgimg=bgr_imagecv2.namedWindow('image')while True:cv2.setMouseCallback('image', on_mouse)# cv2.startWindowThread() # 加在這個位置cv2.imshow('image', img)key=cv2.waitKey(0)if key==13 or key==32:#按空格和回車鍵退出breakcv2.destroyAllWindows()img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)return g_rectdef select_user_roi(image_path):'''由于原圖的分辨率較大,這里縮小后獲取ROI,返回時需要重新scale對應原圖:param image_path::return:'''orig_image = image_processing.read_image(image_path)orig_shape = np.shape(orig_image)resize_image = image_processing.resize_image(orig_image, resize_height=800,resize_width=None)re_shape = np.shape(resize_image)g_rect=get_image_roi(resize_image)orgi_rect = image_processing.scale_rect(g_rect, re_shape,orig_shape)roi_image=image_processing.get_rect_image(orig_image,orgi_rect)image_processing.cv_show_image("RECT",roi_image)image_processing.show_image_rect("image",orig_image,orgi_rect)return orgi_rectif __name__ == '__main__':# image_path="../dataset/images/IMG_0007.JPG"image_path="../dataset/test_images/lena.jpg"# rect=get_image_roi(image)rect=select_user_roi(image_path)print(rect)其中image_processing.py文件如下:
# -*-coding: utf-8 -*- """@Project: IntelligentManufacture@File : image_processing.py@Author : panjq@E-mail : pan_jinquan@163.com@Date : 2019-02-14 15:34:50 """import os import glob import cv2 import numpy as np import matplotlib.pyplot as pltdef show_image(title, image):'''調用matplotlib顯示RGB圖片:param title: 圖像標題:param image: 圖像的數據:return:'''# plt.figure("show_image")# print(image.dtype)plt.imshow(image)plt.axis('on') # 關掉坐標軸為 offplt.title(title) # 圖像題目plt.show()def cv_show_image(title, image):'''調用OpenCV顯示RGB圖片:param title: 圖像標題:param image: 輸入RGB圖像:return:'''channels=image.shape[-1]if channels==3:image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # 將BGR轉為RGBcv2.imshow(title,image)cv2.waitKey(0)def read_image(filename, resize_height=None, resize_width=None, normalization=False):'''讀取圖片數據,默認返回的是uint8,[0,255]:param filename::param resize_height::param resize_width::param normalization:是否歸一化到[0.,1.0]:return: 返回的RGB圖片數據'''bgr_image = cv2.imread(filename)# bgr_image = cv2.imread(filename,cv2.IMREAD_IGNORE_ORIENTATION|cv2.IMREAD_COLOR)if bgr_image is None:print("Warning:不存在:{}", filename)return Noneif len(bgr_image.shape) == 2: # 若是灰度圖則轉為三通道print("Warning:gray image", filename)bgr_image = cv2.cvtColor(bgr_image, cv2.COLOR_GRAY2BGR)rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB) # 將BGR轉為RGB# show_image(filename,rgb_image)# rgb_image=Image.open(filename)rgb_image = resize_image(rgb_image,resize_height,resize_width)rgb_image = np.asanyarray(rgb_image)if normalization:# 不能寫成:rgb_image=rgb_image/255rgb_image = rgb_image / 255.0# show_image("src resize image",image)return rgb_image def resize_image(image,resize_height, resize_width):''':param image::param resize_height::param resize_width::return:'''image_shape=np.shape(image)height=image_shape[0]width=image_shape[1]if (resize_height is None) and (resize_width is None):#錯誤寫法:resize_height and resize_width is Nonereturn imageif resize_height is None:resize_height=int(height*resize_width/width)elif resize_width is None:resize_width=int(width*resize_height/height)image = cv2.resize(image, dsize=(resize_width, resize_height))return image def scale_image(image,scale):''':param image::param scale: (scale_w,scale_h):return:'''image = cv2.resize(image,dsize=None, fx=scale[0],fy=scale[1])return imagedef get_rect_image(image,rect):''':param image::param rect: [x,y,w,h]:return:'''x, y, w, h=rectcut_img = image[y:(y+ h),x:(x+w)]return cut_img def scale_rect(orig_rect,orig_shape,dest_shape):'''對圖像進行縮放時,對應的rectangle也要進行縮放:param orig_rect: 原始圖像的rect=[x,y,w,h]:param orig_shape: 原始圖像的維度shape=[h,w]:param dest_shape: 縮放后圖像的維度shape=[h,w]:return: 經過縮放后的rectangle'''new_x=int(orig_rect[0]*dest_shape[1]/orig_shape[1])new_y=int(orig_rect[1]*dest_shape[0]/orig_shape[0])new_w=int(orig_rect[2]*dest_shape[1]/orig_shape[1])new_h=int(orig_rect[3]*dest_shape[0]/orig_shape[0])dest_rect=[new_x,new_y,new_w,new_h]return dest_rectdef show_image_rect(win_name,image,rect):''':param win_name::param image::param rect::return:'''x, y, w, h=rectpoint1=(x,y)point2=(x+w,y+h)cv2.rectangle(image, point1, point2, (0, 0, 255), thickness=2)cv_show_image(win_name, image)def rgb_to_gray(image):image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)return imagedef save_image(image_path, rgb_image,toUINT8=True):if toUINT8:rgb_image = np.asanyarray(rgb_image * 255, dtype=np.uint8)if len(rgb_image.shape) == 2: # 若是灰度圖則轉為三通道bgr_image = cv2.cvtColor(rgb_image, cv2.COLOR_GRAY2BGR)else:bgr_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)cv2.imwrite(image_path, bgr_image)def combime_save_image(orig_image, dest_image, out_dir,name,prefix):'''命名標準:out_dir/name_prefix.jpg:param orig_image::param dest_image::param image_path::param out_dir::param prefix::return:'''dest_path = os.path.join(out_dir, name + "_"+prefix+".jpg")save_image(dest_path, dest_image)dest_image = np.hstack((orig_image, dest_image))save_image(os.path.join(out_dir, "{}_src_{}.jpg".format(name,prefix)), dest_image)if __name__=="__main__":image_path="../dataset/test_images/src.jpg"image = read_image(image_path, resize_height=None, resize_width=None)image = rgb_to_gray(image)orig_shape=np.shape(image)#shape=(h,w)orig_rect=[50,100,100,200]#x,y,w,hprint("orig_shape:{}".format(orig_shape))show_image_rect("orig",image,orig_rect)dest_image=resize_image(image,resize_height=None,resize_width=200)dest_shape=np.shape(dest_image)print("dest_shape:{}".format(dest_shape))dest_rect=scale_rect(orig_rect, orig_shape, dest_shape)show_image_rect("dest",dest_image,dest_rect)?
總結
以上是生活随笔為你收集整理的Python OpenCV实现鼠标画框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CUDA学习笔记
- 下一篇: Python实现softmax函数