Lunes 23 de Diciembre de 2024, 08:40
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Matlab
»
precesar imagen.....
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: precesar imagen..... (Leído 3462 veces)
Froddo
Nuevo Miembro
Mensajes: 11
precesar imagen.....
«
en:
Jueves 4 de Diciembre de 2008, 06:51 »
0
Hola a todos, les cuento:
He tenido varios problemas al reconocer un color,principalmente por la camara web que no era muy buena(ahora esta arreglado), el cuento es que necesito insertar una sentencia de comparación del color, osea:
if (la foto tomada tiene rojo)
sentencia a aplicar..
end
He intentado cercar el punto de interes (roi)de la foto,para comparar los bits de esta matriz, pero sin mucho éxito....,ya que muchas veces el roi no coincide con el color rojo.
Les puedo comentar que el programa reconoce el color rojo, luego de bastantes pruebas puedo decir que ese tema esatá solucionado, ya que en el camino hubo problemas de brillo en el color, iluminación etc.,para que tengan una idea si la imagen tiene color rojo en la esquina superior izquierda, la imagen mostrada por matlab después del procesamiento es rojo en la esquina izq. y negro en el resto.
Código: Text
cam=videoinput('winvideo');
preview(cam);
for 0:15;
pause(1);
foto=getsnapshot(cam);%consigue la foto de la cámara
b=rgb2hsv(foto);%cambio al plano HSV
H=b(:,:,1);plano Hue
c = H(:,:,1)>0.92; %rango del color rojo
c = uint8(c);
%acontinuación ve el rojo en los tres planos
red(:,:,1) = foto(:,:,1).*c;
red(:,:,2) = foto(:,:,2).*c;
red(:,:,3) = foto(:,:,3).*c;
%luego se puede juntar el resultado y mostar solo el color %deseado con
imshow(red)
end
la imagen mostrada va ser solo el rojo, pero no se en que parte el programa reconoce el color como para decir si hay rojo haces esto..ojala que se comprenda mi problema..
Bueno,me despido y gracias de antemano..
Salu2
Tweet
«
última modificación: Lunes 22 de Diciembre de 2008, 20:55 por Froddo
»
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: precesar imagen.....
«
Respuesta #1 en:
Jueves 4 de Diciembre de 2008, 14:12 »
0
Disculpa, no entendí muy bien cuál es tu problema.
El código que colocaste tiene un par de errores (debes haber copiado mal), lo que hace es buscar los pixeles en la imagen que en el espacio de color HSV tienen un valor de H > 0.92 y el resto de pixeles los elimina (los pone en un valor 0).
La matriz
c
guarda valores 0 y 1 para cada pixel de la imagen original, donde un 1 indica que el pixel que corresponde a esa posición en la imagen tiene un valor H > 0.92, por lo tanto, si deseas ejecutar una acción si encuentras pixeles con H>0.92 una alternativa es recorrer la matriz
c
y evaluar si los valores son 1 o 0, ahí es donde podrías ejecutar la acción que desees.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Froddo
Nuevo Miembro
Mensajes: 11
Re: precesar imagen.....
«
Respuesta #2 en:
Jueves 4 de Diciembre de 2008, 23:24 »
0
Muchas gracias por responder,
sobre el código, podrias decier donde esta el problema...,ya que no lo puedo ver, o te refieres que el código tiene errores para lograr el objetivo final???
Sobre el punto de comparación, una idea que estado inplementando es que ocupar el comando
max(max(c)), ya que con esto aprovecho el hecho de tener la matriz con 1 y ceros., osea modificar el código y tener algo asÍ:
Código: Text
cam=videoinput('winvideo');
preview(cam);
for 0:15;
pause(1);
foto=getsnapshot(cam);%consigue la foto de la cámara
b=rgb2hsv(foto);%cambio al plano HSV
H=b(:,:,1);plano Hue
c = H(:,:,1)>0.92; %rango del color rojo
c = uint8(c);
if (max(max(c)==1);
%aca pongo la sentencia que quiero..
end
end
el problema que noto es que despreocupo los otros planos(el de saturacion y brillo),por eso a veces muestra pixeles blancos...,ya que no puedo aplicar este comando
Código: Text
c=H(:,:,1)>0.96 && H(:,:,2)>0.2 && H(:,:,2)<0.8 && H(:,:,3)>0.4 && H(:,:,3)<0.7;
en matlab sale el siguiente error:
??? Operands to the || and && operators must be convertible to logical scalar values.
Bueno me despido y espero que me ayuden.....
Muchas gracias de antemano...
Salu2
«
última modificación: Viernes 5 de Diciembre de 2008, 08:14 por Froddo
»
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: precesar imagen.....
«
Respuesta #3 en:
Viernes 5 de Diciembre de 2008, 07:11 »
0
El código está bien, me refería a que si copio y pego me da un error con un comentario que no tiene %, y otro con la función rgb2hsv, que me parece debieras aplicar a
foto
y no a la variable
cam
.
En el código que pusiste con &&, no puedes hacer eso, primero, los valores de HSV los debes tomar de la matriz b, resultado de la conversión rgb2hsv, no de la matriz H como pusiste.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Froddo
Nuevo Miembro
Mensajes: 11
Re: precesar imagen.....
«
Respuesta #4 en:
Viernes 5 de Diciembre de 2008, 08:30 »
0
gracias compañero nuevamente, tienes razón,he tenido un error al copiar el program, en la funcion para rgb2hsv y el comentario está arreglado(la pagina dejo el comentario en 2 lineas,ya que lo escribí sólo en una)..
Sobre tu consejo, voy a tomar los valores de la matriz b y te cuento que pasa..
Salu2 y gracias nuevamente....
..
Froddo
Nuevo Miembro
Mensajes: 11
Re: precesar imagen.....
«
Respuesta #5 en:
Sábado 6 de Diciembre de 2008, 17:20 »
0
Hola, esperando que esten bien, les cuento :
La comparación realizada con la sentencia
Código: Text
if (max(max(c)==1);
Ha resultado, pero tiene que ser en condiciones óptimas o sea que el programa no es muy robusto, ya que la mayoría de las veces reconoces pixeles que no son el color rojo.., por ejemplo, si tengo la cámara en un color negro a veces reconoce un pixel blanco producto de la luz...,
por eso estoy intentando restringir el intervalo de los planos S y V.
Lo que tengo pensado es aplicar la siguiente linea de comando:
Código: Text
cam=videoinput('winvideo');
preview(cam);
for 0:15;
pause(1);
foto=getsnapshot(cam);%consigue la foto de la cámara
b=rgb2hsv(foto);%cambio al plano HSV
H=b(:,:,1)>0.92;
S=b(:,:,2)>0.4 && b(:,:,2)<0.8;
V=b(:,:,3)>0.4 && B(:,:,3)<0.6;
c=??????
Mi duda es si multiplico o sumo los planos y por qué???, además de saber si tien lógica lo que he puesto...
Bueno me despido y cualquier ayuda es muy bien recibida...
Salu2
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: precesar imagen.....
«
Respuesta #6 en:
Sábado 6 de Diciembre de 2008, 21:06 »
0
En el código que pones, donde se cumplan las condiciones habrá 1 (unos), donde no, 0 (ceros). Me parece buena idea multiplicarlos, donde no coincidan los tres, el resultado será 0, para tener un 1 como resultado, los tres planos deben cumplir las condiciones
.
Suerte
.
Solo me estoy preguntando una cosa, bien podría hacerse lo mismo sin la conversión a HSV, usando el espacio RGB ¿no? Una opción para robustecerlo sería hacerlo en los dos espacios
.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Froddo
Nuevo Miembro
Mensajes: 11
Re: precesar imagen.....
«
Respuesta #7 en:
Lunes 8 de Diciembre de 2008, 04:42 »
0
Hola compañero, yo de nuevo
,te cuento:
He agragado el siguiente código:
Código: Text
cam=videoinput('winvideo');
preview(cam);
for 0:15;
pause(1);
foto=getsnapshot(cam);%consigue la foto de la cámara
b=rgb2hsv(foto);%cambio al plano HSV
H=b(:,:,1)>0.92;
S=b(:,:,2)>0.4 && b(:,:,2)<0.8;
V=b(:,:,3)>0.4 && B(:,:,3)<0.6;
c=H*S*V
c = uint8(c);
red(:,:,1) = foto(:,:,1).*c;
red(:,:,2) = foto(:,:,2).*c;
red(:,:,3) = foto(:,:,3).*c;
if (max(max(red))==1);
fprintf(SerPIC,'%c','A');
imshow(red);
end
end
Al ejecutar el programa matlab sigue arrojando el error:
Código: Text
??? Operands to the || and && operators must be convertible to logical scalar values.
Otra cosa, cuando no agrego los intervalos de los planos S Y V, osea solo dejo el intervalo del plano H, la sentencia if, no envia el caracter que quiero.., que puede ser???, tengo los puertos com1 abiertos y probados, pero cuando ejecuto el programa no envia el caracter y si muestra la imagen en rojo?????
Geo,sobre el por qué trabajar en el plano HSV, fue por qué supuestamente es más robusto que RGB y me daría menos problemas..
Salu2 y muechas gracias nuevamente por tu paciencia
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: precesar imagen.....
«
Respuesta #8 en:
Jueves 11 de Diciembre de 2008, 08:47 »
0
Prueba con & en lugar de &&.
Esto:
Código: Text
c = H * S * V
podrías sustituirlo por esto:
Código: Text
c = H & S & V
(debería ser el mismo resultado).
En cuanto al problema con la sentencia if, no te entendí muy bien, pero creo que puedes resolverlo por tu cuenta
. Suerte.
La imaginación es el límite.
Hardware & Software
|
Mexchip
Froddo
Nuevo Miembro
Mensajes: 11
Re: precesar imagen.....
«
Respuesta #9 en:
Jueves 11 de Diciembre de 2008, 18:04 »
0
ok, gracias, voy a probar con tu comando, sobre la sentencia if, ya lo he solucionado, he agregado un while
Salu2
Froddo
Nuevo Miembro
Mensajes: 11
Re: precesar imagen.....
«
Respuesta #10 en:
Sábado 13 de Diciembre de 2008, 04:58 »
0
Muchas gracias Geo, tu comando funciona de maravilla, ahora estoy probando los rangos para una óptima toma, muchas gracias por tu paciencia..
y cualquier cosa estoy por acá nuevamente
Salu2
Geo
Miembro de PLATA
Mensajes: 1011
Nacionalidad:
Re: precesar imagen.....
«
Respuesta #11 en:
Domingo 14 de Diciembre de 2008, 19:01 »
0
Qué bien que ya casi lo tienes
.
Un solo apunte: para futuros trabajos podrías trabajar sólo con una foto, no directamente con video. De esta forma podrías manejar una imagen en donde coloques objetos de diferentes tonalidades o colores y evalúes el rendimiento, una vez que te convence el resultado trabajas con el video, sabiendo que tu algoritmo/procesamiento funciona
.
Nos vemos y te tomo la palabra, que para eso estamos aquí, para compartir
. ¡Salud!
La imaginación es el límite.
Hardware & Software
|
Mexchip
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Matlab
»
precesar imagen.....