EmguCV / OpenCV QueryFrame lentos / buffers

votos
2

Nós temos um aplicativo, onde temos uma mensagem de um sistema externo e então tirar uma foto, fazer algum processamento e retornar algo de volta para o sistema externo. Fazer alguns testes de desempenho, eu encontrei dois problemas (eles são um pouco relacionado). Eu estava esperando que alguém será capaz de explicar isso para mim.

1) Faz _capture.QueryFrame()quadros de tampão? O que vemos é que, se existe uma lacuna entre a consulta para dois quadros de uma câmera web, o segundo quadro é muitas vezes uma imagem mais velho e não a um quando o queryFrame foi chamado.

Fomos capazes de mitigar este problema até certo ponto, descartando alguns quadros, ou seja, chamando _capture.QueryFrame()2-3 vezes e descartando os resultados.

2) O segundo problema é que, quando programado diferentes partes da aplicação, descobriu-se que para cortar o tampão (chamando QueryFrame()2-3 vezes e não utilizar os resultados) leva cerca de 65ms e, em seguida, esta linha: Image<Bgr, Byte> source = _capture.QueryFrame()demora cerca de 80 ms. Estas duas partes tomar a maior fatia de tempo de processamento, o nosso processamento real leva apenas sobre 20-30ms mais.

Existe uma maneira mais rápida (a) para limpar o buffer (b) para capturar o quadro?

Se você tem experiência com OpenCV e saber de algo relacionado, por favor, me avise.

Publicado 28/03/2010 em 20:01
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Isso também poderia ser devido à taxa de actualização da câmara web você está usando. Minha câmera funciona a 60Hz, por isso tenho um temporizador que leva captura um quadro a cada 15 milissegundos.

Respondeu 09/05/2011 em 13:19
fonte usuário

votos
2

I respondeu a uma pergunta semelhante System.TypeInitializationException usando Emgu.CV em C # e testados tendo as várias possibilidades para a aquisição de um até à data quadro I encontrados a abaixo o método bes.

1) Sim, quando você configurar uma captura de uma webcam um buffer de anel é criado para armazenar as imagens neste permite a alocação effcient de memória.

2) Sim, há uma maneira mais rápida, configure seu dispositivo de captura-se globalmente e configurá-lo de gravação e chamando ProcessFrame para obter uma imagem do buffer sempre que pode. Agora, mudar o seu QueryFrame simplesmente copiar tudo o que enquadra a sua acabou de adquirir. Esperamos que possa parar o seu problema de obter o quadro anterior e agora você vai ter o quadro mais recente fora do buffer.

private Capture cap;
Image<Bgr, Byte> frame;

public CameraCapture()
{
    InitializeComponent();
    cap= new Capture();
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height);
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width);

    Application.Idle += ProcessFrame;
}

private void ProcessFrame(object sender, EventArgs arg)
{
    frame = _capture.QueryFrame();
    grayFrame = frame.Convert<Gray, Byte>();
}

public Image<Bgr,byte> QueryFrame()
{
    return frame.Copy();
}

Espero que isso ajude, se não me avise e eu vou tentar adaptar uma solução para suas necessidades. Não esqueça que você pode sempre ter a sua aquisição em execução em um segmento diferente e invocar o novo método QueryFrame.

Felicidades

Chris

Respondeu 27/09/2011 em 17:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more