实时图像

写了一个关于实时图像滚动显示的例子,做个记录。

滚动算法:

难点:

将内存数据绘制到界面,需要用到QImage和QPixmap,使用QImage转换一下,具体参见代码。这个费了好大劲才弄出来(网上的资料大都很简单,处理个QImage打开保存啊等等操作,项目实用性不强。)

from PIL import Image

import numpy as np

import threading

import time

class GraphicWidget(QWidget):

def __init__(self):

super(GraphicWidget,self).__init__()

self.threadStop = False

self.drawWidth = 1080

self.drawHeight = 800

self.imgWholeData = None

self.imgScreenData = np.zeros([self.drawHeight,self.drawWidth],np.uint8)

self.imgTotalLines = 0

self.imgWidth = 0

self.threadStop = True

pass

def doscroll(self):

if self.threadStop:

img = Image.open("d:/test2.png")

self.imgWholeData = np.array(img)

self.imgTotalLines, self.imgWidth = self.imgWholeData.shape

scrollThread = threading.Thread(target = self.scroll)

scrollThread.start()

def stop(self):

self.threadStop = True

def scroll(self):

step = 5

srcStartLine = 0

srcEndLine = step

destEndLine = step

self.threadStop = False

while not self.threadStop:

if destEndLine > self.drawHeight:

destEndLine = self.drawHeight

if srcEndLine > self.drawHeight:

srcStartLine = srcEndLine - self.drawHeight

if srcEndLine > self.imgTotalLines:

print("scroll end")

self.threadStop = True

break

if srcStartLine < self.drawHeight:

self.imgScreenData = np.zeros([self.drawHeight,self.drawWidth],np.uint8)

self.imgScreenData[0:destEndLine] = self.imgWholeData[srcStartLine:srcEndLine]

self.update()

destEndLine = destEndLine + step

srcEndLine = srcEndLine + step

time.sleep(0.005)

pass

def paintEvent(self,event):

try:

painter = QPainter()

destRect = QRect(0,0,self.drawWidth,self.drawHeight)

srcRect = QRect(0,0,self.drawWidth,self.drawHeight)

img = QImage(self.imgScreenData.data, self.drawWidth, self.drawHeight, QImage.Format_Indexed8)

pix = QPixmap.fromImage(img)

painter.begin(self)

painter.drawPixmap(destRect, pix, srcRect)

painter.end()

except Exception as e:

print(e)

raise

Pass

经验证,图像“拖尾”比较严重,图像滚动平滑效果比不上用DirectX做的效果,但是刷新效率很高,QT这块做的比C#好很多。

下次,实用Opengl做一个,看看效果咋样。

Pyqt5 实时图像滚动的更多相关文章

  1. 基于FPGA的线阵CCD实时图像采集系统

    基于FPGA的线阵CCD实时图像采集系统 2015年微型机与应用第13期 作者:章金敏,张 菁,陈梦苇2016/2/8 20:52:00 关键词: 实时采集 电荷耦合器件 现场可编程逻辑器件 信号处理 ...

  2. PyQt5实时汇率查询

    用PyQt5实现了界面,使用urllib实时抓取ip138.com网站的汇率信息. import sys import urllib import urllib.request from PyQt5. ...

  3. 在python3下使用OpenCV 抓取摄像头图像并实时显示3色直方图

    以下代码为在Python3环境下利用OpenCV 抓取摄像头的实时图像, 通过OpenCV的 calHist函数计算直方图, 并显示在3个不同窗口中. import cv2 import numpy ...

  4. 动手写一个快速集成网易新闻,腾讯视频,头条首页的ScrollPageView,显示滚动视图

    最终效果 更新示例.gif 示例效果.gif 示例效果1.gif 示例效果2.gif 示例效果3.gif 示例效果4.gif 示例效果5.gif 示例效果6.gif 一.构思部分: 打算分为三个部分, ...

  5. 基于邮件系统的远程实时监控系统的实现 Python版

    人生苦短,我用Python~ 界内的Python宣传标语,对Python而言,这是种标榜,实际上,Python确实是当下最好用的开发语言之一. 在相继学习了C++/C#/Java之后,接触Python ...

  6. 图像采集系统的Camera Link标准接口设计

    高速数据采集系统可对相机采集得到的实时图像进行传输.实时处理,同时实现视频采集卡和计算机之间的通信.系统连接相机的接口用的是Camera Link接口,通过Camera Link接口把实时图像高速传输 ...

  7. HAAR与DLib的实时人脸检测之实现与对比

    人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等. 对于opencv的人脸检测方法,优点是简单,快速:存在的问题是人脸检测效果不好.正面/垂直/光线较好的人脸, ...

  8. Python-opencv摄像头图像捕获

    实例一 (灰色调度) #!/usr/bin/env python # _*_ coding:utf-8 _*_ import cv2 as cv import numpy as np capture ...

  9. 【iOS开发-55】图片轮播案例:scrollView的分页、滚动栏、利用代理控制定时器和Page Control以及多线程问题

    案例: (1)用storyboard布局,这里用了三样东西. --UIScrollView就是我们准备存放滚动图片的容器. --Page Control就是控制页数的那几个小点点.能够设置有多少个点. ...

随机推荐

  1. apache启动目录(禁止目录)与设置默认入口文件的方法

    设置默认入口文件的方法: 打开apache的conf目录,找到httpd.conf文件,打开这个文件,搜索dir_module,找到以下截图修改位置进行修改,注意重启apache服务器,修改位置才会生 ...

  2. 利用xshell从windows上传文件到虚拟机

    Xshell实现Windows上传文件到Linux主机 经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我 ...

  3. js发起长轮询获取推送消息

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  4. java数据结构-非线性结构之树

    一.树状图 树状图是一种数据结构,它是由n(n>=1)个有限节点组成的具有层次关系的集合.因其结构看起来想个倒挂的树,即根朝上,叶子在下,故被称为"树". 特点: 1. 每个 ...

  5. PHP环境配置综合篇

    1.WNMP: http://www.wnmp.com.cn/     En: https://www.getwnmp.org/ 2.xampp:https://www.apachefriends.o ...

  6. c#判断输入textbox是否为数字

    asp.net判断输入文字是否是数字 方案一:/**//// <summary> /// 名称:IsNumberic /// 功能:判断输入的是否是数字 /// 参数:string oTe ...

  7. Android M(6.0) 权限爬坑之旅

    坑一:用Android5.0编译的apk,在Android6.0上运行完全没有问题. 在Android6.0以上才需要在运行时请求权限,在旧Android版本上保留原有逻辑,安装时授予权限. 用旧版本 ...

  8. PureMVC(JS版)源码解析(三):Observer类

          上一篇博客中,我们讲到了Notification类(消息类),Notification(消息)是连接观察者(observer)和通知者(notifier)之间的桥梁.这一篇博客,主要是在代 ...

  9. NDK开发之调用方法

    与NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法.JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法. 我们的MainActivity中 ...

  10. oracle设定用户密码使用时间

    强制用户定期更换密码,要怎么设置? 假设密码用10天之后必须修改,宽限期为2天: 把电脑时间往后调十天,然后登录: 系统提示用户密码两天内失效,这时把电脑系统再往后调两天,然后登录: 系统提示密码已经 ...