opencv改变imshow窗口大小,窗口位置,ROI

11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进步,关注我,给你分享更多干货知识!

目录

安装

跟踪根据id分配颜色:

改变窗口大小:

移动位置

选取矩形ROI

选取多边形ROI

绘制图形


安装

pip install opencv-python

跟踪根据id分配颜色:

def get_color(idx):
    idx = idx * 5
    color = ((37 * idx) % 255, (17 * idx) % 255, (29 * idx) % 255)
    return color

改变窗口大小:

c++:


创建窗口时候改变下参数就可以鼠标随意拖动窗口改变大小啦

cv::namedWindow("camera", CV_WINDOW_NORMAL);//CV_WINDOW_NORMAL就是0
cv::imshow("camera", frame);

python: 


imgpath=r"d:/20200708002140.jpg"
width=1200
height=800
img=cv2.imread(imgpath)

cv2.namedWindow("canny", 0)
cv2.resizeWindow("canny", 300, 300)  # 设置窗口大小

cv2.imshow("canny", img)
cv2.waitKey()

移动位置

imgpath=r"d:/20200708002140.jpg"
width=1200
height=800

img=cv2.imread(imgpath)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# 改变窗口位置:left top

cv2.moveWindow("image", 1000, 100)

#改变窗口位置:left top

cv2.imshow("image", img)
cv2.waitKey()

选取矩形ROI

    OpenCV自带 API 可直接选择矩形区域作为ROI,该API位于目标追踪模块,主要是cv2.selectROI()函数。

import cv2

import imutils


img = cv2.imread("./test_image.jpg")

img = imutils.resize(img, width=500)


roi = cv2.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)

x, y, w, h = roi


cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)

cv2.imshow("roi", img)

cv2.waitKey(0)

cv2.destroyAllWindows()



选取多边形ROI

    多边形ROI,主要利用鼠标交互进行绘制:

   1. 单击左键,选择多边形的点;

   2. 单击右键,删除最近一次选择的点;

   3. 单击中键,确定ROI区域并可视化。

   4. 按”S“键,将多边形ROI区域的点保存到本地”config.pkl"文件中。

import cv2
import numpy as np
import joblib

pts = []  # 用于存放点
select_ok = False
def draw_roi(event, x, y, flags, param):
    img2 = img.copy()
    global select_ok
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点
        if select_ok:
            pts.clear()
        pts.append((x, y))
        select_ok = False
    if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点
        select_ok = True
    if (event == cv2.EVENT_LBUTTONDBLCLK):
        select_ok=True
    if event == cv2.EVENT_MBUTTONDOWN:  # 中键绘制轮廓
        pts.pop()
    if select_ok:
        mask = np.zeros(img.shape, np.uint8)
        points = np.array(pts, np.int32)
        # saved_data = {"ROI": pts}
        joblib.dump(value=points, filename=pkl_file)

        print('select ok points')
        print(points)
        # 画多边形
        img2 = cv2.polylines(img2, [points], True, (0, 255, 0), 2)
        # cv2.imshow('mask', mask)

    elif len(pts) > 0:
        # img2=cv2.polylines(img2, [np.array(pts, np.int32)], True, (255, 0, 255), 2)
        for i in range(len(pts)):
            cv2.circle(img2, pts[i],3, (255, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标
            if i<len(pts)-1:
                cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 255), thickness=2)
    cv2.imshow('image', img2)


# 创建图像与窗口并将窗口与回调函数绑定
# img = cv2.imread("./zhai_first.jpg")
# img = cv2.imread("./nuohua_first.jpg")
img = cv2.imread("d:/caoyuan.jpg")
pkl_file="zhai_config.pkl"
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择ROI点,单击右键:选择完毕,单击中键:撤销一步")
print("[INFO] 按 ESC 退出")

# while True:
key = cv2.waitKey(0) & 0xFF
print("select end----")
if len(pts) > 0:
    print("ok")
if key == 27:
    print("stop")

cv2.destroyAllWindows()

读取config.pkl:

     model1 = joblib.load(filename="config.pkl")
 
     print(model1)

没有选择完毕时,都画时,会出现意想不到的情况:

import cv2
import numpy as np
import joblib

pts = []  # 用于存放点

# 统一的:mouse callback function
def draw_roi(event, x, y, flags, param):
    img2 = img.copy()
    select_ok=False
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点
        pts.append((x, y))

    if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点
        select_ok = True
    if (event == cv2.EVENT_LBUTTONDBLCLK):

        select_ok=True
    if event == cv2.EVENT_MBUTTONDOWN:  # 中键绘制轮廓
        pts.pop()
    if select_ok:
        mask = np.zeros(img.shape, np.uint8)
        points = np.array(pts, np.int32)
        print(points)
        # saved_data = {"ROI": pts}
        joblib.dump(value=points, filename=pkl_file)

        print('select ok points',points)
        # 画多边形
        # mask = cv2.polylines(img, [points], True, (255, 0, 255), 2)
        # cv2.imshow('mask', mask)

    if len(pts) > 0:
        img2=cv2.polylines(img, [np.array(pts, np.int32)], True, (255, 0, 255), 2)
        for i in range(len(pts)):
            cv2.circle(img2, pts[i],3, (255, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标
            # if i<len(pts)-1:
            #     cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 255), thickness=2)
    cv2.imshow('image', img2)


# 创建图像与窗口并将窗口与回调函数绑定
# img = cv2.imread("./zhai_first.jpg")
img = cv2.imread("./nuohua_first.jpg")
pkl_file="zhai_config.pkl"
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")
print("[INFO] 按 ESC 退出")

# while True:
key = cv2.waitKey(0) & 0xFF
print("select end----")
if len(pts) > 0:
    print("ok")
if key == 27:
    print("stop")

cv2.destroyAllWindows()

画的螺旋状:

绘制图形

以下内容转自:

OpenCV入门(26):矩形、圆形、扇形及任意多边形的绘制_Home丶Basic的博客-CSDN博客_opencv 扇形

import cv2
import numpy as np

newImageInfo = (500,500,3)
dst = np.zeros(newImageInfo,np.uint8)

# 绘制矩形  1.目标图片  2.左上角  3.右下角  4.颜色  5.内容是否填充(-1:填充; 》0的值:线条宽度)
cv2.rectangle(dst,(50,100),(200,300),(255,0,0),-1)
# 绘制圆形  1.目标图片  2.圆心  3.半径  4.颜色  5.是否填充
cv2.circle(dst,(250,250),80,(0,255,0),2)
# 绘制扇形  1.目标图片  2.椭圆圆心  3.长短轴长度  4.偏转角度  5.圆弧起始角度  6.终止角度  7.颜色  8.是否填充
cv2.ellipse(dst,(256,256),(150,100),0,0,145,(255,255,0),-1)
# 绘制任意多边形  
points = np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32)
# print(points.shape)#  --->(5, 2)
points = points.reshape((-1,1,2))
# print(points.shape)#  --->(5, 1, 2)
cv2.polylines(dst,[points],True,(0,255,255))

cv2.imshow('dst',dst)
cv2.waitKey(0)

 绘制圆扇形

# 绘制圆形扇形  1.目标图片  2.椭圆圆心  3.长短轴长度  4.偏转角度  5.圆弧起始角度  6.终止角度  7.颜色  8.是否填充
cv2.ellipse(dst,(256,256),(150,150),0,0,-45,(255,255,0),0)

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/54718563