OpenCV---003(图像添加和窗口交互)

图像绘制及窗口交互

本文将介绍在窗口内创建图像和在窗口创建一些交互操作

绘制图像和生成文字

1.绘制圆
    img = cv.circle(img,center,radius,color,thickness=None,lineType=None)
    img: 需要被绘制的图像
    center: 圆心
    radius: 半径
    color:颜色
    thickness: 轮廓宽度 为负数时绘制的是实心圆,默认为1

2.绘制线段
    img = cv.line(img,p1,p2,color,thickness=None,lineType=None)
    p1:点1
    p2:点2

3.绘制椭圆
    img = cv.ellipse(img,center,axes,angle,startAngle,endAngle,color,thickness=None,lineType=None)
    center: 椭圆中心
    axes: 椭圆长短半轴长度元组类型
    angle: 椭圆旋转角度
    startAngle: 椭圆弧起始角度
    endAngle: 椭圆弧终止角度
    img = cv.ellipse(img, (200, 200),(100,50),0,0,360, (0, 255, 0))

4.绘制多边形
    img = cv.rectangle(img,p1,p2,color,thickness=None,lineType=None)
    img = cv.rectangle(img,rec,color,thickness=None,lineType=None)
    p1: 矩形的一个顶点
    p2: 相对的顶点 连点在对角线上
    rec: 矩形左上角顶点及长宽

    img = cv.fillPoly(img,pts,color,thickness=None,lineType=None)
    pst: 多边形顶点数组
    

5.生成文字
    img = cv.putText(img,text,org,fontFace,fontScale,color,thickness,lineType,bottomLeftOrigin)
    text: 文本 目前仅支持中文
    org: 字符串左下角像素坐标
    fontFace: 字体类型选择 0普通字体 1小尺寸字体 
    fontScale: 字体大小
    color: 颜色
    thickness: 字体粗细
    lineType: 线条类型
    bottomLeftOrigin: 图像数据原点位置,默认左上角

import cv2 as cv
import numpy as np
import sys

if __name__ == '__main__':
    img = cv.imread('preview.jpg')
    if img is None:
        print('读取失败')
        sys.exit()

    img = cv.circle(img, (200, 200), 100, (255, 0, 0), 5)

    img = cv.line(img, (200, 100), (200, 200), (0, 0, 255))
    img = cv.ellipse(img, (300, 300), (100, 50), 0, 0, 360, (0, 255, 0), 6)

    img = cv.rectangle(img, (400, 400, 100, 100), (0, 0, 255), 5)

    pst1 = np.array([[500, 500], [400, 600], [600, 600]], dtype='int32')
    img = cv.fillPoly(img, [pst1], (255, 0, 0))

    img = cv.putText(img, 'welcome to Opencv4', (100, 100), 1, 2, (255, 0, 0))
    cv.imshow('cir', img)
    cv.waitKey(0)
    cv.destroyAllWindows()

image

区域划定

有时候我们仅仅对一张图像中的部分区域感兴趣,而原图像比较大,如果处理全部的图像会占用较大的内存,所以,我们需要截取
部分图像,这部分图像称为感兴趣区域。

所以可以直接的 
    ROI = img[y1:y2,x1:x2]
    ROI : 感兴趣区域

图像金字塔

图像金字塔是通过多个分辨率表示图像的一种有效且简单的方式,一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的
图像,金字塔底部是待处理图像的高分辨率,而顶部是低分辨率

高斯金字塔:
    构建高斯金字塔是解决尺寸不确定性的一种方法。通过下采样不断地缩短图像的大小,运行一次变为默认一半
    dst = cv.pyrDown(src)
    cv.pyrDown() 和 cv.resize() 效果函数一样 但是内部的算法不一样

拉普拉斯金字塔:
    和高斯金字塔相反,通过上层的小尺寸图像构建下层大尺寸图像,其内部是和高斯金字塔联合实现的
    dst = cv.pyrUP(src)

交互式窗口

一般有滑动条和鼠标点击响应

窗口滑动条:
    一般可以用作调节参数
    cv.createTrackbar(tarckbarname,winname,value,count,onChange,userdata)
    trackbarname: 滑动条名称
    winname: 指向整数变量的指针
    value: 初值
    count: 滑动条最大值
    onChange: 每次滑动条改变位置需要调用的函数指针
    userdata: 传递给回调函数的可选参数

    该函数能够在窗口上方创建一个范围从0开始的滑动条,并将创建后的结果通过值返回
    value = cv.getTrackbarPos(滑块名, winname)
	获得滑块值

	当值改变时 值会自动的传入回调函数

import cv2 as cv
import numpy as np
import sys


def call_back_big(x):
    global img, hei, img1

    hei = cv.getTrackbarPos('y', 'change_img')
    img1 = img[:hei]


if __name__ == '__main__':
    img = cv.imread('preview.jpg')
    if img is None:
        print('读取失败')
        sys.exit()
    cv.namedWindow('change_img')
    hei = 500
    img1 = img[:500]

    cv.createTrackbar('y', 'change_img', hei, 1024, call_back_big)

    while True:
        cv.imshow('change_img', img1)
        if cv.waitKey(1) == ord('q'):
            break
    cv.destroyAllWindows()

image

鼠标相应:
    None = cv.setMouseCallback(winname,onMouse)
    winname: 窗口名称
    onMouse: 回调函数

    回调函数中的响应事件标志
    cv.EVENT_MOUSEMOVE 0  鼠标在窗口移动
    cv.EVENT_LBUTTONDOWN 1  按下左键
    cv.EVENT_RBUTTONDOWN 2  按下右键
    cv.EVENT_LBUTTONUP 4  释放左键
    cv.EVENT_RBUTTONUP 5  释放右键

    响应标志
    cv.EVENT_FLAG_LBUTTON 1  按下左键拖拽
    cv.EVENT_FLAG_RBUTTON 2  按下右键拖拽

import cv2 as cv
import numpy as np
import sys


def draw(event, x, y, flags, param):
    global img, pre_pts
    if event == cv.EVENT_RBUTTONDOWN:
        print('请检测按下按键')
    if event == cv.EVENT_LBUTTONDOWN:
        pre_pts = (x, y)
        print('起始坐标为{}'.format(pre_pts))
    if event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_LBUTTON:
        pts = (x, y)
        img = cv.line(img, pre_pts, pts, (0, 0, 255), 2, 5, 0)
        pre_pts = pts
        cv.imshow('img', img)


if __name__ == '__main__':
    img = cv.imread('preview.jpg')
    img1 = img.copy()
    if img is None:
        print('读取失败')
        sys.exit()

    pre_pts = (0, 0)
    cv.imshow('img', img)
    cv.setMouseCallback('img', draw)
    cv.waitKey(0)
    cv.destroyAllWindows()

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值