es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo usar Vec2w en Opencv Python

Tengo esta parte de código funcionando en C++:


Mat mapFrame5(Size(321,262), CV_16UC2);
for (int y = 0; y < mapFrame5.rows; y++) {
for (int x = 0; x < mapFrame5.cols; x++) {
mapFrame5.at<Vec2w>(y, x) = Vec2w(y, x);
cout<<mapFrame5.at<Vec2w>(y,x);
}
}

Tengo dificultades para encontrar si hay un equivalente de esta expresión en Python:


mapFrame5.at<Vec2w>(y, x) = Vec2w(y, x);

He intentado lo siguiente como se sugiere:

testArr2 = np.zeros([262,321], np.uint16)

y,yy = 0,0
byteCount = 0
while yy < 262:
    x,xx = 0,0
    while xx < 321:
        testArr2[yy,xx] = [yy,xx]
        xx+=1
        x+=1
        byteCount+=1
    yy+=1
    y+=1 

Pero solo me da este error:

builtins.TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'

Para mayor claridad estoy tratando de guardar los valores y,x en un archivo binario en formato little endian.

Ejemplo:

y = 0

0 0 0 1 0 2 0 3 … 0 320

y = 261

261 0 261 1 261 2 … 261 320

El archivo C++ me da exactamente 336408 bytes.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, el código que proporcionó con numpy no funciona porque no puede asignar una lista a un elemento en un arreglo numpy. En su lugar, puede usar la función de numpy meshgrid para generar arreglos de los valores x e y y luego apilarlos a lo largo de la última dimensión para obtener el equivalente de Vec2w en C++. Aquí hay un código de ejemplo:

    import numpy as np
    
    # inicializar el arreglo de prueba con ceros
    testArr2 = np.zeros([262,321,2], np.uint16)
    
    # generar arreglos de valores x e y usando meshgrid
    x_vals = np.arange(0, 321)
    y_vals = np.arange(0, 262)
    x_mesh, y_mesh = np.meshgrid(x_vals, y_vals)
    
    # apilar los arreglos x e y a lo largo de la última dimensión
    coords = np.dstack((y_mesh, x_mesh))
    
    # asignar los valores al arreglo de prueba
    testArr2[:,:,:] = coords[:,:,:]
    
    # verificar los valores
    print(testArr2[0,0,:])  # imprime [0,0]
    print(testArr2[261,320,:])  # imprime [261, 320]
    

    Esto debería darle un arreglo equivalente al arreglo mapFrame5 de C++, con los valores x e y apilados a lo largo de la última dimensión. Luego puede guardar este arreglo en un archivo binario usando la función tofile de numpy, de esta manera:

    testArr2.tofile('nombre_archivo.bin')
    

    Esto debería darle la misma cantidad de bytes que el archivo de C++, ya que el arreglo tiene el mismo tamaño y tipo de datos.

Comments are closed.