elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Temas
Páginas: [1]
1  Programación / Java / OpenCv + Android + Problemas con Matrices en: 6 Abril 2022, 01:25 am
Buenas foreros!  :D
Como habréis podido leer en el título este es un asunto relacionado con programación en Java para una app Android usando la librería openCV. En resumidas cuentas el programa carga una red neuronal que ya hemos entrenado con una batería de imágenes. El programa original, por comodidad y por poca experiencia lo codificamos en Java pensando que como Android y Java van bastante de la mano no habría una dificultad grande a la hora de traducirlo para una app, bien el problema parte a la hora de proporcionarle la entrada a la red neuronal.
Código
  1.  
  2. Mat frame = new Mat(); // Matriz de OpenCv
  3. Mat fgMask = new Mat();
  4. MatOfByte mem = new MatOfByte();
  5.  
  6.        BackgroundSubtractor backSub;
  7.        backSub = Video.createBackgroundSubtractorKNN(5, 0, false);
  8.  
  9.        VideoCapture capture = new VideoCapture(0); // Captura camara por defecto
  10.        if (!capture.isOpened()) {
  11.            System.exit(0);
  12.        }
  13.  
  14.        while (true) {
  15.  
  16.            capture.read(frame);
  17.            if (frame.empty()) {
  18.                break;
  19.            }
  20.  
  21. Imgproc.cvtColor(frame, frame, Imgproc.COLOR_BGR2GRAY, 0);//Imagen a Escala de grises
  22. Imgproc.GaussianBlur(frame, frame, new Size(15, 15), 0); //Aplicamos un Suavizado
  23. backSub.apply(frame, fgMask); //Eliminamos fondo de frame y guardamos en fgMask
  24. Imgproc.resize(fgMask, fgMask, new Size(250, 250)); //redimensionamos
  25.  
  26. //      Aquí es donde hicimos el apaño para java, que no puede funcionar en Android    
  27. //      Puesto que BufferedImage e Image no existen en las librerias para Android    
  28.  
  29.               Mat image= new Mat();
  30.               Imgcodecs.imencode(".jpg", fgMask, mem);
  31.               Image im=null;
  32.  
  33.            try {
  34.                im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
  35.                BufferedImage buff = (BufferedImage)im;    
  36.                image = BufferedImage2Mat(buff);
  37.            } catch (IOException ex) {
  38.         Logger.getLogger(VideoCaptureejemplo.class.getName()).log(Level.SEVERE, null, ex);
  39.            }
  40.  
  41.  
  42.  
  43.            Mat blob = blobFromImage(image,1 ,new Size(250,250));
  44.  
  45.  
  46.  
  47.           clasificador.setInput(blob);
  48.  
  49.  
  50.  
  51.            Mat res = clasificador.forward();
  52.            System.out.println(res.dump());
  53.  
  54.  
  55.  
  56.        }
  57.  
  58.        System.exit(0);
  59.    }
  60. public static Mat BufferedImage2Mat(BufferedImage image) throws IOException {
  61.  
  62.    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  63.    ImageIO.write(image, "jpg", byteArrayOutputStream);
  64.    byteArrayOutputStream.flush();
  65.    return Imgcodecs.imdecode(new MatOfByte(byteArrayOutputStream.toByteArray()), CV_32FC1);
  66. }

Testeando y probando he llegado a la conclusión que a pesar de que la función BlobFromImage solicita una Matriz como primer parametro esta debe de estar construida de una forma un poco más especial, si yo trato de enviar una Matriz como fgMask en vez de una BufferedImage lanzará un error:
Contenido de fgMask:

Mat [ 1*1*250*250*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0x1fb55df0, dataAddr=0x23991140 ]

Contenido de fgMask(BufferedImage):

Mat [ 1*3*250*250*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0x1f59f110, dataAddr=0x21d63c00 ]

Código del Error:
Código:
[ERROR:0] global C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\dnn.cpp (3512) cv::dnn::dnn4_v20210608::Net::Impl::getLayerShapesRecursively OPENCV/DNN: [Convolution]:(sequential/conv2d/Conv2D): getMemoryShapes() throws exception. inputs=1 outputs=0/1 blobs=2
[ERROR:0] global C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\dnn.cpp (3515) cv::dnn::dnn4_v20210608::Net::Impl::getLayerShapesRecursively     input[0] = [ 1 1 250 250 ]
[ERROR:0] global C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\dnn.cpp (3523) cv::dnn::dnn4_v20210608::Net::Impl::getLayerShapesRecursively     blobs[0] = CV_32FC1 [ 16 3 3 3 ]
[ERROR:0] global C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\dnn.cpp (3523) cv::dnn::dnn4_v20210608::Net::Impl::getLayerShapesRecursively     blobs[1] = CV_32FC1 [ 16 1 ]
[ERROR:0] global C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\dnn.cpp (3525) cv::dnn::dnn4_v20210608::Net::Impl::getLayerShapesRecursively Exception message: OpenCV(4.5.3) C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\layers\convolution_layer.cpp:386: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 1 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'

Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.5.3) C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\dnn\src\layers\convolution_layer.cpp:386: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 1 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'
]
    at org.opencv.dnn.Net.forward_1(Native Method)
    at org.opencv.dnn.Net.forward(Net.java:237)

¿Alguien sabe como cambiar o qué significa el segundo digito en la información de las matrices que he puesto arriba? No sé pero siento que de modificar ese caracter sin recurrir a la chapuza de BufferedImage se podría solucionar todo fácilmente.


2  Informática / Hardware / El famoso Black screen de las gpu amd en: 28 Agosto 2020, 04:23 am
Hola foreros!

Vengo por aquí buscando un poco de ayuda con este asunto que ya me está volviendo loco.

Resulta que hace relativamente poco, decidí cambiar la GPU de mi sistema, y la actualice a una amd r9 290, todo parecía ir de lujo, pero cuando decidí activar la opción de ocultar la barra de tareas automáticamente empecé a ver la cantidad de fallos que tenia amd con el tema de drivers...

Parece ser que con la mayoría de drivers que han sacado la gran mayor parte de juegos no se pueden jugar en pantalla completa, pero de alguna forma, si estos se ejecutan en modo ventana, funcionan a la perfección, tres cuartos de lo mismo pasa con el tema de la barra de tareas, si está oculta y entro a intentar personalizar el tema del escritorio o a la configuración de pantalla, si tengo la ventana ampliada PUM! pantallazo negro, sino, funciona a la perfección, he estado trasteando con drivers y resulta que la versión 15.7.1 todo funciona como debería, pero es una versión demasiado obsoleta.

Supongo que tiene que ser algún problema con el escalado de la pantalla, pero no tengo ni idea si puede ser configurable o corregido este problema manualmente, alguna idea?
3  Programación / Programación General / 3 en raya .asm 6809 en: 12 Mayo 2015, 16:23 pm
Hola chicos , estoy tratando de simular en el 6809 el típico juego de 'el gato' o más conocido como 3 en raya. Bien , el problema me surge a la hora de que en la práctica se me especifica que debo de crear el tablero y que este se autorefresque es decir , no lo puedo imprimir una y otra vez con los nuevos movimientos , el tablero se me ha ocurrido recrearlo imprimiendo direcciones de memoria seguidas , ya que me facilitaria el imprimirlas con su valor en ascii , es decir , cuando del teclado lee un 1 , hace un salto a esta subrutina y en ella con un ld , almacena el valor 88 , (en ascii una X) a la vez que en la direccion siguiente almacena un 48 (un 0 en ascii)

obviamente no voy a copiar todo el codigo porque seria muy extenso por aqui dejo el modulo jugador vs maquina , esperando que me den alguna idea para refrescar el tablero.
OJO no pido código.

Código:
jugador_maquina:

  lda teclado
cmpa #1
bne compara2
jsr siesuno
bra jugador_maquina

compara2:

cmpa #2
bne compara3
jsr siesdos
bra jugador_maquina

compara3:
cmpa #3
bne compara4
jsr siestres
bra jugador_maquina

compara4:
cmpa #4
bne compara5
jsr siescuatro
bra jugador_maquina

compara5:
cmpa #5
bne compara6
jsr siescinco
bra jugador_maquina

compara6:
cmpa #6
bne compara7
jsr siesseis
bra jugador_maquina

compara7:
cmpa #7
bne compara8
jsr siessiete
bra jugador_maquina

compara8:
cmpa #8
bne compara9
jsr siesocho
bra jugador_maquina

compara9:
cmpa #9
bne Valorerroneo
jsr siesnueve
bra jugador_maquina

valorerroneo:
jsr imprime valor_erroneo
4  Programación / Programación General / Ayuda con modulo verilog en: 12 Enero 2015, 17:12 pm
Verán ,ando trabajando en un contador con biestables que realiza una cuenta, el problema es que como resultado tengo 2 bucles de 0->8 y otro de 7->15 , el tema es por si alguien puede echarme un cable y decirme como puedo iniciar el contador en un número que no esté en bucle , el 2 por ejemplo , por aqui dejo el codigo fuente del programa que tengo hecho hasta ahora.. Mencionar que no pido ningún codigo solo el como hacerlo.

*Edit : Todo resuelto , despues de investigar un buen rato alcance la solucion :D
Código:
//Modulo del biestable JK
module JKdown(output reg Q, output wire QN, input wire J, input wire K,   input wire C);
  not(NQ,Q);

  initial
  begin
    Q=0;
  end    

  always @(posedge C)
    case ({J,K})
      2'b10: Q=1;
      2'b01: Q=0;
      2'b11: Q=~Q;
    endcase
endmodule


//Módulo que contiene el contador y la circuitería auxiliar.
module contador (output wire[3:0] Q, input wire C);
 //Cables correspondientes a las salidas negadas de los biestables.
  wire [3:0] nQ;
  
  wire rand;
 
  
  // J2, K2
  and (rand, Q[0], nQ[3]);
  
  JKdown jk0 (Q[0], nQ[0], Q[1], Q[1], C);
  JKdown jk1 (Q[1], nQ[1], Q[0], Q[0], C);
  JKdown jk2 (Q[2], nQ[2], rand, rand, C);
  JKdown jk3 (Q[3], Q[3], 1'b1, 1'b1, C);

endmodule


//Módulo para probar el circuito.
module test;
  reg C;
  wire [3:0] Q;
  contador counter (Q,C);

  always
  begin
    #9 C=~C;
    
  end

  initial
  begin
  
   $monitor($time, "Q[3:0]=%b", Q[3:0]);
    
  //Iniciar cuenta en 2
    counter.jk3.Q=0;
    counter.jk2.Q=0;          
    counter.jk1.Q=1;
    counter.jk0.Q=0;

    C=0;
    #300 $finish;
  end
endmodule



[MOD]: Utiliza las etiquetas para insertar código.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines