图像截切显示python实现

主要用到opencv的cv2,直接贴代码:

import cv2
import numpy as np
global img
#global point1,point2
cut_Pos = np.zeros((2,2),np.int)
def on_mouse(event,x,y,flags,param):
    global img,point1,point2
    img2 = img.copy()
    if event == cv2.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):
        cv2.rectangle(img2,point1,(x,y),(255,0,0),5)#移动点击下的左键,画出蓝色截图框
        cv2.imshow('image',img2)
    elif event == cv2.EVENT_LBUTTONUP:
        point2 = (x,y)
        cv2.rectangle(img2,point1,point2,(0,0,255),5)#松开左键,显示最终的红色截图框
        cv2.imshow('image',img2)
        
        cut_Pos[0][0]=min(point1[0],point2[0])
        cut_Pos[0][1]=max(point1[0],point2[0])
        cut_Pos[1][0]=min(point1[1],point2[1])
        cut_Pos[1][1]=max(point1[1],point2[1])
        cv2.imshow('image',img[cut_Pos[1][0]:cut_Pos[1][1],cut_Pos[0][0]:cut_Pos[0][1]])
        
        #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])
        #cut_img = img[min_y:min_y+height,min_x:min_x+width]
        #cv2.imwrite('photo_1.jpeg',cut_img)
        
        
def main():
    global img
    img = cv2.imread('E://photo_1.jpeg')
    cv2.namedWindow('image')
    cv2.setMouseCallback('image',on_mouse)
    cv2.imshow('image',img)
    cv2.waitKey(0)
if __name__ == '__main__':
    main()

用到的函数主要是:

cv2.imread(image_path,flag):

读取图像,两个参数。参数1给出图像路径;参数2指定图像读取方式(默认加载彩色图像,标识为1;灰度图标识0;-1表示加载的图像包含alpha通道)。

cv2.imshow():

建立窗口显示图片,共两个参数。参数1指定窗口名称;参数2是读入的图片对象。

cv2.nameWindow():

新建窗口,有两个参数。参数1窗口名称;参数2是窗口属性,决定是否窗口可以调整。

 

cv2.setMouseCallback():

void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
    winname:窗口的名字
    onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针

                    这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param)
                              event是 CV_EVENT_*变量之一;

                              x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系);

                              flags是CV_EVENT_FLAG的组合,

                              param是用户定义的传递到setMouseCallback函数调用的参数。

                              userdate:传给回调函数的参数

cv2.waitKey():

键盘绑定函数,只有一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现双击视频框时截取视频框中的图像并复制到剪贴板,您可以使用JavaScript和Canvas元素来完成。以下是一个示例代码: ```html <!DOCTYPE html> <html> <head> <title>截取视频框图像到剪贴板</title> <style> #videoContainer { width: 800px; height: 600px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } #videoElement { width: 100%; height: 100%; } </style> </head> <body> <div id="videoContainer"> <video id="videoElement" autoplay></video> </div> <script> var video = document.getElementById("videoElement"); var canvas = document.createElement("canvas"); var context = canvas.getContext("2d"); navigator.mediaDevices.getUserMedia({ video: true }) .then(function (stream) { video.srcObject = stream; }) .catch(function (error) { console.log("无法访问摄像头: ", error); }); video.addEventListener("dblclick", function () { canvas.width = video.videoWidth; canvas.height = video.videoHeight; context.drawImage(video, 0, 0, canvas.width, canvas.height); canvas.toBlob(function (blob) { var item = new ClipboardItem({ "image/png": blob }); navigator.clipboard.write([item]).then(function () { console.log("图像已复制到剪贴板"); }).catch(function (error) { console.log("无法复制图像到剪贴板: ", error); }); }, "image/png"); }); </script> </body> </html> ``` 在上面的代码中,我们创建了一个名为`videoContainer`的`<div>`元素,其中包含一个`<video>`元素用于显示视频流。我们使用CSS将视频框居中显示。 使用`navigator.mediaDevices.getUserMedia()`方法获取摄像头的视频流,并将其赋值给`video.srcObject`属性,以便在视频框中显示摄像头的实时图像。 通过监听视频框的`dblclick`事件,当用户双击视频框时,会触发相应的处理函数。在处理函数中,我们创建一个canvas元素,并将视频框中的图像绘制到canvas上。 使用`canvas.toBlob()`方法将canvas上的图像转换为Blob对象。然后,我们创建一个ClipboardItem对象,将Blob对象添加到剪贴板,并使用`navigator.clipboard.write()`方法将图像复制到剪贴板。 请注意,由于剪贴板API的兼容性限制,该代码可能无法在所有浏览器中正常工作。特别是在某些旧版本的浏览器中,对剪贴板API的支持可能有限。因此,在实际应用中,您可能需要进行浏览器兼容性检查和相应的错误处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值