O formato NV21 pega as cores no formato YCrCb (componentes b e r invertidos)
Sendo assim o código que funcionou foi esse:
private PreviewCallback p = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
int frameHeight = camera.getParameters().getPreviewSize().height;
int frameWidth = camera.getParameters().getPreviewSize().width;
RGB(data,frameWidth,frameHeight);
}
};
E a função RGB:
//Retirado e adaptado de: http://stackoverflow.com/questions/9325861/converting-yuv-rgbimage-processing-yuv-during-onpreviewframe-in-android
private void RGB( byte[] data, int imageWidth, int imageHeight){
int numPixels = imageWidth*imageHeight;
mCamera.setPreviewCallback(null);
mCamera.startPreview();
for (int y = 0; y < imageHeight; y++) {
for (int x = 0; x < imageWidth; x++) {
// Get the Y value, stored in the first block of data
// The logical "AND 0xff" is needed to deal with the signed issue
int Y = data[y*imageWidth + x] & 0xff;
// Get U and V values, stored after Y values, one per 2x2 block
// of pixels, interleaved. Prepare them as floats with correct range
// ready for calculation later.
int xby2 = x/2;
int yby2 = y/2;
float V = (float)(data[numPixels + 2*xby2 + yby2*imageWidth] & 0xff) - 128.0f;
float U = (float)(data[numPixels + 2*xby2 + 1 + yby2*imageWidth] & 0xff) - 128.0f;
// Do the YUV -> RGB conversion
float Yf = 1.164f*((float)Y) - 16.0f;
int R = (int)(Yf + 1.596f*V);
int G = (int)(Yf - 0.813f*V - 0.391f*U);
int B = (int)(Yf + 2.018f*U);
// Clip rgb values to 0-255
R = R < 0 ? 0 : R > 255 ? 255 : R;
G = G < 0 ? 0 : G > 255 ? 255 : G;
B = B < 0 ? 0 : B > 255 ? 255 : B;
}
}
A partir daí fiz umas continhas de menos Ex: r-g && r-b , para determinar a cor predominante em cada pixel, incrementei um contator e quem for maior é a cor RGB predominante na imagem.
No meu caso basta!
:)
Obrigado
--
Carlos Eduardo Simões Pelegrin
Em 3 de outubro de 2013 08:58, Carlos Eduardo <carloseduardopelegrin@gmail.com> escreveu:
Ops, o software usa o ImageFormat.NV21 (default android). Eu que estava de "braço curto" aqui!para setar o modo que eu quero de exposição a branco:Camera.Parameters params = mCamera.getParameters(); params.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_FLUORESCENT);mCamera.setParameters(params);Agora está tudo encaminhado, falta apenas converter de hex para RGB.após postarei o código!Att.
--
Carlos Eduardo Simões PelegrinEm 3 de outubro de 2013 08:46, Carlos Eduardo <carloseduardopelegrin@gmail.com> escreveu:
Bom dia,Eu estou justamente nesse ponto.Consegui entender que aparentemente o método decodeYUV420SP do exemplo usa codificação inicial ImageFormat.YV12.Parece também que ele converte a cor para ARGB (0xffa97fad) mas o alfa é sempre FF, sendo assim, eliminei esse alfa e tenho a cor em HEX;Vou converter para rgb que é o que preciso.Encontrei um outro problema, agora com a câmera.O método de cor e/ou exposição a luz, não sei qual, ou se os dois estão me atrapalhando.A imagem da câmera fica amarela, atrapalhando na identificação da cor!Estou pesquisando uma forma de setar o modo para fluorescente, que parece identificar melhor.
Um ponto que analisei no Color Grab é que ele parece controlar esses parâmetro para sempre deixar a câmera ajustada conforme a necessidade do software.Isso é possível?Obrigado.
--
Carlos Eduardo Simões PelegrinEm 2 de outubro de 2013 16:48, marcelo yonamine <yonamine60@gmail.com> escreveu:De algum modo (desculpe, mas não sei) vc deve converter os valores RGB para Color e mostrar as cores em uma listview
http://stackoverflow.com/questions/17761852/how-to-set-rgb-color-in-android
Em 2 de outubro de 2013 16:04, Carlos Eduardo <carloseduardopelegrin@gmail.com> escreveu:
Consegui começar a me achar no código,Consegui implementar o ultimo exemplo do link(pegar os frames), porém ainda não consegui identificar a cor.Att.
--
Carlos Eduardo Simões PelegrinEm 2 de outubro de 2013 15:30, Carlos Eduardo <carloseduardopelegrin@gmail.com> escreveu:
Eu tentei incluir esse exemplo no meu código mas n rodou não,Estou me perdendo em meio tantos extends e implements.Tem algum exemplo funcional?O que entendi de câmera:Tenho um objeto Camera e tenho que ter um preview (no meu caso é um framelayout que recebe um objeto de uma classe que extend SurfaceView e implements SurfaceHolder.Callback).Aparentemente no preview eu conseguiria pegar o frame e identificar as cores conforme os pixels?att.
--
Carlos Eduardo Simões Pelegrin2013/10/2 marcelo yonamine <yonamine60@gmail.com>SurfaceView e RGB
http://stackoverflow.com/questions/15918180/get-rgb-from-a-surfaceview-displaying-live-camera
--2013/10/2 Carlos Pelegrin <carloseduardopelegrin@gmail.com>
Boa tarde pessoal,--Pergunta "simples" mas não sei por onde começar a procurar.Como identificar cores pela câmera?Criei um app que usa câmera usando o exemplo http://developer.android.com/guide/topics/media/camera.html e agora queria identificar cores de uma forma parecida com esse app: https://play.google.com/store/apps/details?id=com.loomatix.colorgrabAlguma sugestão?Obrigado
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.






0 comentários:
Postar um comentário