Используя Python и OpenGL, я создаю простой красный треугольник RGBA = (1,0,0,1) и сохраняю его как bmp. Затем я загружаю изображение с помощью CV2 и извлекаю цвета RGBA, которые можно увидеть.
Я хочу, чтобы красный цвет и цвет фона были единственными цветами изображения.
Этот код некрасивый, но успешно генерирует и сохраняет изображение треугольника как bmp:
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
from OpenGL.GL import shaders
import numpy as np
from PIL import Image
import cv2
VERTEX_SHADER = """
#version 330
in vec4 position;
void main() {
gl_Position = position;
}
"""
FRAGMENT_SHADER = """
#version 330
void main() {
gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
"""
shaderProgram = None
WIDTH, HEIGHT = 200,200
def initialize():
global VERTEX_SHADER
global FRAGMENT_SHADER
global shaderProgram
vertexshader = shaders.compileShader(VERTEX_SHADER, GL_VERTEX_SHADER)
fragmentshader = shaders.compileShader(FRAGMENT_SHADER, GL_FRAGMENT_SHADER)
shaderProgram = shaders.compileProgram(vertexshader, fragmentshader)
triangles = [-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0]
triangles = np.array(triangles, dtype=np.float32)
VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, triangles.nbytes, triangles, GL_STATIC_DRAW)
position = glGetAttribLocation(shaderProgram, "position")
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 0, None)
glEnableVertexAttribArray(position)
def render():
glClearColor(0,0,0,1)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(shaderProgram)
glDrawArrays(GL_TRIANGLES,0,3)
glUseProgram(0)
# Save a screenshot
screenshot_file_path = 'test.bmp'
data = glReadPixels(0,0,200,200, GL_RGBA,GL_UNSIGNED_BYTE)
image = Image.frombytes('RGBA',(200, 200), data)
image.save(screenshot_file_path, 'bmp')
print('Image saved to ' + screenshot_file_path)
glutSwapBuffers()
def main():
glutInit()
glutInitWindowSize(WIDTH, HEIGHT)
glutInitWindowPosition(200,200)
glutCreateWindow("Modern Opengl Triangle")
initialize()
glutDisplayFunc(render)
glutMainLoop()
if __name__ == "__main__":
main()
Но когда я анализирую цвета изображения, я вижу 3 триплета RGB! вместо ожидаемого 2.
Код разбора изображения:
import cv2
import numpy as np
imgfile = r"test.bmp"
npimg = cv2.imread(imgfile)
# cv2 reads the file into BGR, but we want to see the color as RGB
npimg = cv2.cvtColor(npimg, cv2.COLOR_BGR2RGB)
# Get unique RGB colors
uniqueRGB, uniqueRGBcounts = np.unique(npimg.reshape(-1, npimg.shape[2]), axis=0, return_counts=True)
print(uniqueRGB)
Результат:
[[ 0 0 0] <- Background
[188 0 0] <- ??? some other red
[255 0 0]] <- Desired red
Что здесь происходит? Кто-нибудь может объяснить, откуда берется лишняя тройка? Что еще более важно, как убедиться, что ТОЛЬКО (255,0,0) и фоновый (0,0,0) RGB сохраняются в bmp-изображении?