Usando C ++ para fazer interface com uma câmera de varredura de linha a 3000Hz e processar / exibir os dados [fechados]

Vários meses atrás, comecei a trabalhar em um projeto para desenvolver um algoritmo para processar dados adquiridos de um dispositivo de câmera linecan (por exemplo, uma linha de 384 pixels a cada 300us). Como sou engenheiro e não programador, comecei a trabalhar com o Python para minimizar a curva de aprendizado. Com a ajuda do SX, desenvolvi com êxito um aplicativo Python (que acabou sendo mais de 2000 linhas de código) e criei com êxito um algoritmo de processamento de imagem para trabalhar com os dados. Eu impressionava o cliente e eles queriam levá-lo para o próximo nível. Agora, eu preciso que seja em tempo real ... e isso significa C ++. Eu peguei o C ++ acelerado de Koenig e Moo e comecei a ler. Então, por favor, seja fácil comigo. Adoro aprender a programar, mas não tenho treinamento formal. Eu estou fazendo o melhor que posso!

Agora eu tenho uma GUI protótipo C ++ (usando Qt) em torno de todas as bibliotecas necessárias para se comunicar com a câmera através de uma interface CameraLink. O código de aquisição vive em seu próprio segmento e emite sinais para a GUI. Então, eu tenho os fundamentos no lugar. Eu posso adquirir quantas linhas de dados desejar com meu código atual, mas agora estou tentando descobrir como criar um aplicativo em torno disso. Até escreveu um makefile personalizado que funciona com o Qt (MOCing, etc.)

Enfim, para o aplicativo, gostaria de dois modos (estas são as PERGUNTAS):

(1) Uma visualização "ao vivo" ... onde os dados do linecan são exibidos em tempo real pela GUI. Eu estava pensando em usar um buffer circular (por exemplo, Boost :: circular buffer) para manter os dados em tempo real, e simplesmente passar uma cópia do buffer (memcpy?) Para a GUI através de um sinal emitido. Isso é sustentável? Eu sinto que a cópia do buffer é necessária, já que o buffer circular vai mudar a cada 300 ou mais e eu não sei se o loop do evento principal pode acompanhar. Mais uma vez, a aquisição de dados vive em seu próprio segmento. Tem que ser mais complicado que isso? Terei que estourar dados do buffer à medida que ele for lido em vez de usar um buffer circular? Eu senti que um buffer circular era o caminho a seguir, já que é exatamente o tipo de imagem que eu quero exibir.

(2) Um modo de processamento de dados ... onde os dados de linhas podem ser emitidos em blocos (isto é, 384 x 384) pixels. A uma taxa de varredura de 300us (~ 3.333 Hz), isto é, um bloco ou quadro a cada 100ms ou mais. Nesses 100ms, precisarei fazer a normalização de dados, detecção de objetos, limite, etc. Estou planejando executar isso em uma caixa do Linux executando patch de kernel em tempo real. Eu acho que deveria continuar. Eu precisarei me comunicar entre os segmentos de aquisição de dados e processamento de dados ... eu preciso de soquetes para isso?

Estou procurando conselhos sobre como começar com essas duas peças. O segundo é mais crítico, mas o primeiro me ajudará a visualizar o que está acontecendo. Por fim, gostaria de ter os dois modos em execução simultaneamente. Passei a maior parte da semana chegando tão longe ... mas preciso garantir que estou seguindo o caminho certo com o meu plano.

questionAnswers(1)

yourAnswerToTheQuestion