如何最有效地更正PySide(Qt4,Python)中的Qimages/QPixmaps或QGraphicsView或qgraphicsproxy widget的Gamma值?

2024-10-04 01:23:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图改变一个视频小部件的gamma值(声子视频小工具)通过代理显示在QGraphicsView中。我注意到QtGui的QGraphicsEffect是通过代理来实现的,但是只有模糊、单色覆盖和阴影的默认设置。声子视频小工具它本身有亮度,对比度,甚至色调的选择,但奇怪的是没有伽马校正选项。QGraphicsEffects的速度不是很快,但它们肯定能通过graphicsproxy与videowidget一起播放媒体。我决定先创建我自己的QGraphicsEffect,但在当前状态下似乎不可能。在

我从一些简单的东西开始,一个单一的QPixmap(我从中获取QImage)。由于QGraphicsEffect似乎主要是在它的虚拟绘制函数中使用QPixmaps,所以我想这是一个很好的开始)和gamma校正的地方。成功了。但是,目前即使使用numpy也太慢了(setPixel for QImage更慢),转换一张1200x900400kbjpg图像需要5秒或更长时间。在

我的方法是根据输入的gamma值创建一个从0到255的gamma转换值的列表。然后使用numpy,使用pixmap中的QImage创建一个指向图像数据的数组,最后用表上的相应值编辑每个像素(因此每个像素不需要额外计算)。代码的主要内容如下

gammaTable = []

for i in xrange(256):
    gammaPixel = CorrectGamma( i, gammaValue ) #returns numpy.int8 or int, works properly
    gammmaTable.append(gammaPixel)

qimage = myPixmap.toImage()
bytes = qimage.bits() #qimage.constBits()
imageBytes = numpy.asarray(bytes).reshape(qimage.width(), qimage.height(), 4)

#Change each pixel      
for x in xrange(qimage.width()):
    for y in xrange(qimage.height()):
        imageBytes[x,y,0] = gammmaTable[imageBytes[x,y,0]] #gammaDictionary[imageBytes[x,y,0]]
        imageBytes[x,y,1] = gammmaTable[imageBytes[x,y,1]] #gammaDictionary[imageBytes[x,y,1]]
        imageBytes[x,y,2] = gammmaTable[imageBytes[x,y,2]] #gammaDictionary[imageBytes[x,y,2]]
        imageBytes[x,y,3] = gammmaTable[imageBytes[x,y,3]] #gammaDictionary[imageBytes[x,y,3]]

return qimage

我只在程序开始时运行一次,它运行得很好,但是太慢了。我也试过用图像扫描线()但老实说,我不知道如何使用它,而且也没有setScanLine()函数可以使用。constScanLine返回一个不可编辑的数组。我调查的另一个问题是彩色图像(). 但是,他们对我来说总是空的,所以我不能和他们一起工作。在

我正在考虑尝试opencvforpython,但我不确定它是否适合我的需要,但我确实在youtube上看到了一个视频,上面有人声称使用Qt和OpenCV在widget中的视频流上创建一个看起来像覆盖层(看起来像是noisefilter和nightfilter),这或多或少就是我需要的。它没有说什么,但是,它可以是C++ QT(我正在工作Python和QT4,通过py一边)。在

我有一种很好的感觉,如果我没有做错事,也许Python对于这个来说太慢了。目前的瓶颈似乎是迭代和更改指向QImage数据数组的numpyimagebytes数组的每个值需要很长时间。我不知道如何使用C++和编译pythy/python,我不确定是否我可以把它翻译成C++,尤其是在处理指针和Python和C++之间共享的想法上。在

我也有一种感觉,我在某个地方错过了一个解决方案,但我没有发现任何其他的选择可以考虑或尝试。我可能在想,也许我可以在图形项目上加上某种覆盖,但我意识到这没什么意义,似乎也没有这种东西(最接近的是QGraphicsEffect)。在


Tags: in图像numpyfor视频数组gammaxrange