Найти - Пользователи
Полная версия: Изображение из массива.
Начало » Python для экспертов » Изображение из массива.
1 2 3
Levelup
Я изначально пошел не тем путем. Мне необходимо создать программу, чтобы управлять яркостью изображения посредством OpenGL. Таким образом, из входного двумерного массива должно формироваться изображение в градации серого, подгружаться в OpenGL и уже там изменяться. За основу беру класс GLCanvas из библиотеки wxWidgets. Ниже привожу пример куба, обрабатываемого в OpenGL. Не подскажете куда копать дальше?


import wx
from wx import glcanvas
from OpenGL.GL import *
from OpenGL.GLUT import *
from wx.glcanvas import GLCanvas, WX_GL_DOUBLEBUFFER
from numpy import clip, histogram, cumsum, searchsorted, uint16

class ButtonPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
c = sdfsdf(self)
c.SetSize((200, 200))

class MyCanvasBase(glcanvas.GLCanvas):
def __init__(self, parent):
glcanvas.GLCanvas.__init__(self, parent, -1)
self.init = False
# initial mouse position
self.lastx = self.x = 0
self.lasty = self.y = 0
self.size = None
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMotion)

def OnPaint(self, event):
dc = wx.PaintDC(self)
self.SetCurrent()
if not self.init:
self.InitGL()
self.init = True
self.OnDraw()

def OnMouseDown(self, evt):
self.CaptureMouse()
self.x, self.y = self.lastx, self.lasty = evt.GetPosition()

def OnMouseUp(self, evt):
self.ReleaseMouse()

def OnMouseMotion(self, evt):
if evt.Dragging() and evt.LeftIsDown():
self.lastx, self.lasty = self.x, self.y
self.x, self.y = evt.GetPosition()
self.Refresh(False)

class sdfsdf(MyCanvasBase):
def InitGL(self):
# set viewing projection
glMatrixMode(GL_PROJECTION)
glFrustum(-1, 1, -1, 1, 1, 5)

# position viewer
glMatrixMode(GL_MODELVIEW)
glTranslatef(0, 0, -2.0)

# position object
glRotatef(self.y, 3.0, 0.0, 0.0)
glRotatef(self.x, 0.0, 1.0, 0.0)


glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)

def OnDraw(self):
# clear color and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

# draw six faces of a cube
glBegin(GL_QUADS)
glNormal3f( 0.0, 0.0, 1.0)
glVertex3f( 0.6, 0.6, 0.6)
glVertex3f(-0.5, 0.5, 0.5)
glVertex3f(-0.5,-0.5, 0.5)
glVertex3f( 0.5,-0.5, 0.5)

glNormal3f( 0.0, 0.0,-1.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f(-0.5, 0.5,-0.5)
glVertex3f( 0.5, 0.5,-0.5)
glVertex3f( 0.5,-0.5,-0.5)

glNormal3f( 0.0, 1.0, 0.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f( 0.5, 0.5,-0.5)
glVertex3f(-0.5, 0.5,-0.5)
glVertex3f(-0.5, 0.5, 0.5)

glNormal3f( 0.0,-1.0, 0.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f( 0.5,-0.5,-0.5)
glVertex3f( 0.5,-0.5, 0.5)
glVertex3f(-0.5,-0.5, 0.5)

glNormal3f( 1.0, 0.0, 0.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f( 0.5,-0.5, 0.5)
glVertex3f( 0.5,-0.5,-0.5)
glVertex3f( 0.5, 0.5,-0.5)

glNormal3f(-1.0, 0.0, 0.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f(-0.5,-0.5, 0.5)
glVertex3f(-0.5, 0.5, 0.5)
glVertex3f(-0.5, 0.5,-0.5)
glEnd()

if self.size is None:
self.size = self.GetClientSize()
w, h = self.size
w = max(w, 1.0)
h = max(h, 1.0)
xScale = 180.0 / w
yScale = 180.0 / h
glRotatef((self.y - self.lasty) * yScale, 1.0, 0.0, 0.0);
glRotatef((self.x - self.lastx) * xScale, 0.0, 1.0, 0.0);

self.SwapBuffers()


app = wx.App(False)
try:
frame = wx.Frame(None)
panel = ButtonPanel(frame)
frame.Show()
app.MainLoop()
finally:
del app
regall
Levelup, есть спецификация OpenGL, туда и смотрите. Там примеры на С, но перевести на Python очень легко, так как весь OpenGL API состоит только из вызовов функций.
Единственное, что хочу заметить, что так сейчас уже никто не пишет. Это пример из OpenGL API 1.0 - 1.5. Курс введения в современный OpenGL можно почитать здесь
Levelup
Большое спасибо за информацию! Возникла очередная проблема. Написал пример создания окна, описанный на сайте. Каким образом можно запустить скрипт? В статье код компилируют…

from OpenGL.GLUT import *

def main(*args, **kwarg):
glutInit(*args, **kwarg)
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE)
glutInitWindowSize(400,300)
glutCreateWindow('Hello world')
glutDisplayFunc(render)
glutIdleFunc(update_fade_factor)
glutMainLoop()

def make_resourses():
pass

def update_fade_factor():
pass

def static(*args):
glClearColor(1.0,1.0, 1.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
glutSwapBuffers()
regall
Levelup
Логично было бы добавить в конец скрипта:
if __name__ == '__main__':
main()
Levelup
Благодарю!
Levelup
Подскажите, пожалуйста, каким образом данное изображение

import numpy as np
def f(i,j):
return i**2 + j**2

w, h = 512, 512
image = np.fromfunction(f, (w, h))+10000
b1, b2 = np.min(image), np.max(image)
print ‘array min max =’, b1, b2
image = (image-b1)/(b2-b1)*255
print ‘new min max =’, np.min(image), np.max(image)
image = np.array(image, dtype=np.uint8)

можно вставить в окно wx.frame?

import wx
class MyFrame(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)

app = wx.App(False)
try:
frame = wx.Frame(None)
panel = MyFrame(frame)
frame.Show()
app.MainLoop()
finally:
del app
Levelup
Ну помогите, пожалуйста! Очень надо..
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB