Friday, 17 November 2017

Média móvel ponderada opencv


Suavização de Imagens Objetivos Aprenda a: Desfocar imagens com vários filtros de baixa passagem Aplicar filtros personalizados a imagens (convolução 2D) Convolução 2D (Filtragem de Imagem) Como para sinais unidimensionais, as imagens também podem ser filtradas com vários filtros passa-baixa (LPF ), Filtros passa-alta (HPF), etc. Um LPF ajuda na remoção de ruído ou embaçamento da imagem. Um filtro HPF ajuda a encontrar bordas em uma imagem. OpenCV fornece uma função, cv2.filter2D (). Para convolver um kernel com uma imagem. Como exemplo, vamos tentar um filtro de média em uma imagem. Um kernel de filtro de média de 5x5 pode ser definido da seguinte maneira: Filtrando com o resultado do kernel acima resulta o seguinte sendo executado: para cada pixel, uma janela 5x5 é centrada neste pixel, todos os pixels que caem dentro desta janela são resumidos eo resultado é Então dividido por 25. Isso equivale a calcular a média dos valores de pixels dentro dessa janela. Esta operação é executada para todos os pixels da imagem para produzir a imagem filtrada de saída. Experimente este código e verifique o resultado: Blurring de imagem (Suavização de imagem) O desfoque de imagem é conseguido convertendo a imagem com um kernel de filtro passa-baixa. É útil para remover o ruído. Ele realmente remove o conteúdo de alta freqüência (por exemplo, ruído, bordas) da imagem resultando em bordas sendo desfocada quando este é filtro é aplicado. (Bem, há técnicas de desfocagem que não desfocam bordas). OpenCV fornece principalmente quatro tipos de técnicas de desfoque. 1. Estabelecimento de média Isso é feito convolvendo a imagem com um filtro de caixa normalizado. Ele simplesmente leva a média de todos os pixels sob a área do kernel e substitui o elemento central por essa média. Isso é feito pela função cv2.blur () ou cv2.boxFilter (). Verifique os documentos para obter mais detalhes sobre o kernel. Devemos especificar a largura ea altura do kernel. Um filtro caixa 3x3 normalizado seria semelhante a este: Se você don8217t deseja usar um filtro de caixa normalizada, use cv2.boxFilter () e passar o argumento normalizeFalse para a função. Verifique a demo de exemplo abaixo com um kernel de tamanho 5x5: 2. Filtragem Gaussiana Nesta abordagem, em vez de um filtro de caixa consistindo de coeficientes de filtro iguais, um kernel Gaussiano é usado. É feito com a função, cv2.GaussianBlur (). Devemos especificar a largura ea altura do kernel que deve ser positivo e ímpar. Também devemos especificar o desvio padrão nas direções X e Y, sigmaX e sigmaY, respectivamente. Se apenas o sigmaX for especificado, sigmaY é tomado como igual a sigmaX. Se ambos são dados como zeros, eles são calculados a partir do tamanho do kernel. A filtragem gaussiana é altamente eficaz na remoção do ruído gaussiano da imagem. Se você quiser, você pode criar um kernel gaussiano com a função, cv2.getGaussianKernel (). O código acima pode ser modificado para borrar Gaussian: 3. Median Filtering Aqui, a função cv2.medianBlur () calcula a mediana de todos os pixels sob a janela do kernel eo pixel central é substituído por esse valor mediano. Isso é altamente eficaz na remoção de ruído de sal e pimenta. Uma coisa interessante a notar é que, nos filtros Gaussiano e Box, o valor filtrado para o elemento central pode ser um valor que pode não existir na imagem original. No entanto, este não é o caso na mediana de filtragem, uma vez que o elemento central é sempre substituído por algum valor de pixel na imagem. Isso reduz o ruído de forma eficaz. O tamanho do kernel deve ser um inteiro ímpar positivo. Nesta demonstração, adicionamos um ruído de 50 à nossa imagem original e usamos um filtro mediano. Verifique o resultado: 4. Filtragem Bilateral Como observamos, os filtros que apresentamos anteriormente tendem a desfocar bordas. Este não é o caso para o filtro bilateral, cv2.bilateralFilter (). Que foi definido para, e é altamente eficaz na remoção de ruído enquanto preserva bordas. Mas a operação é mais lenta em comparação com outros filtros. Já vimos que um filtro gaussiano toma a vizinhança ao redor do pixel e encontra sua média ponderada gaussiana. Este filtro gaussiano é uma função do espaço sozinho, isto é, os pixels próximos são considerados durante a filtragem. Ele não considera se pixels têm quase o mesmo valor de intensidade e não considera se o pixel está em uma borda ou não. O efeito resultante é que os filtros gaussianos tendem a desfocar bordas, o que é indesejável. O filtro bilateral também usa um filtro gaussiano no domínio espacial, mas também usa mais um componente de filtro (multiplicativo) gaussiano que é uma função das diferenças de intensidade de pixels. A função gaussiana do espaço garante que apenas os pixels são vizinhos 8217spatial8217 são considerados para a filtragem, enquanto que o componente gaussiano aplicado no domínio de intensidade (uma função gaussiana das diferenças de intensidade) garante que apenas aqueles pixels com intensidades semelhantes ao do pixel central 8216, vizinhos8217) para calcular o valor de intensidade desfocada. Como resultado, este método preserva bordas, uma vez que para pixels situados perto de bordas, os pixels vizinhos colocados no outro lado da aresta e, portanto, exibindo grandes variações de intensidade quando comparados com o pixel central, não serão incluídos para desfocagem. O exemplo abaixo demonstra o uso de filtragem bilateral (Para detalhes sobre argumentos, consulte os documentos do OpenCV). Observe que a textura na superfície desapareceu, mas as arestas ainda são preservadas. Imagens suaves A explicação abaixo pertence ao livro Computer Vision: Algorithms and Applications de Richard Szeliski e ao LearningOpenCV Smoothing. Também chamado de borrão. É uma operação de processamento de imagem simples e freqüentemente usada. Existem muitas razões para suavizar. Neste tutorial vamos nos concentrar no alisamento para reduzir o ruído (outros usos serão vistos nos tutoriais a seguir). Para executar uma operação de suavização, aplicaremos um filtro à nossa imagem. O tipo mais comum de filtros são lineares. Em que um valor de pixel de saída 8217s (isto é) é determinado como uma soma ponderada de valores de pixel de entrada (isto é): Ajuda a visualizar um filtro como uma janela de coeficientes deslizando através da imagem. Existem muitos tipos de filtros, aqui vamos mencionar os mais utilizados: Filtro de caixa normalizada Este filtro é o mais simples de todos Cada pixel de saída é a média de seus vizinhos do kernel (todos eles contribuem com pesos iguais) O kernel está abaixo: Gaussian Filtro Provavelmente o filtro mais útil (embora não o mais rápido). A filtragem gaussiana é feita convolvendo cada ponto na matriz de entrada com um kernel gaussiano e, em seguida, somando-os todos para produzir a matriz de saída. Apenas para tornar a imagem mais clara, lembre-se de como um kernel 1D gaussiano parece Assumir que uma imagem é 1D, você pode notar que o pixel localizado no meio teria o maior peso. O peso de seus vizinhos diminui à medida que a distância espacial entre eles eo pixel central aumenta. Lembre-se que um Gaussiano 2D pode ser representado como: Filtro Mediano O filtro mediano percorre cada elemento do sinal (neste caso a imagem) e substitui cada pixel pela mediana de seus pixels vizinhos (localizados em uma vizinhança quadrada em torno do pixel avaliado ). Filtro bilateral Até agora, explicamos alguns filtros cujo principal objetivo é suavizar uma imagem de entrada. No entanto, às vezes os filtros não só dissolver o ruído, mas também afastar as bordas. Para evitar isso (pelo menos em certa medida), podemos usar um filtro bilateral. De forma análoga ao filtro gaussiano, o filtro bilateral também considera os pixels vizinhos com pesos atribuídos a cada um deles. Estes pesos têm duas componentes, a primeira das quais é a mesma ponderação utilizada pelo filtro Gaussiano. O segundo componente leva em conta a diferença de intensidade entre os pixels vizinhos e o avaliado. Para uma explicação mais detalhada, você pode verificar este link Código O que este programa faz Carrega uma imagem Aplica 4 tipos diferentes de filtros (explicados em Teoria) e mostra as imagens filtradas sequencialmente Explicação Let8217s verifica as funções OpenCV que envolvem apenas o procedimento de suavização, uma vez que O resto já é conhecido por agora. Filtro de Bloqueio Normalizado: O OpenCV oferece a função de desfocagem para realizar a suavização com este filtro. Nós especificamos 4 argumentos (mais detalhes, verifique a Referência): src. Imagem de origem dst. Tamanho da imagem de destino (w, h). Define o tamanho do kernel a ser usado (de largura w pixels e altura h pixels) Ponto (-1, -1). Indica onde o ponto de ancoragem (o pixel avaliado) está localizado em relação à vizinhança. Se houver um valor negativo, então o centro do kernel é considerado o ponto de ancoragem. É realizada pela função GaussianBlur: Aqui usamos 4 argumentos (mais detalhes, verifique a referência do OpenCV): Uma Biblioteca de Subtração de Fundo Última Atualização da Página: 15/06/2017 Última Versão da Biblioteca: 1.9.2 (veja Notas de Versão para mais informações ) A BGSLibrary foi desenvolvida por Andrews Sobral e fornece uma estrutura C fácil de usar baseada em OpenCV para realizar a subtração de fundo (BGS) em vídeos. A BGSLibrary compila sob Linux, Mac OS X e Windows. Atualmente, a biblioteca oferece 37 algoritmos BGS. Uma grande quantidade de algoritmos foram fornecidos por vários autores. O código fonte está disponível sob licença GNU GPL v3, a biblioteca é livre e de código aberto para fins acadêmicos. Para usuários do Windows, é fornecido um projeto de demonstração para o Visual Studio 2018/2017. Uma versão executável de BGSLibrary está disponível para Windows 32 bits e 64 bits. Para usuários de Linux e Mac, um Makefile pode ser usado para compilar todos os arquivos. Nota: a BGSLibrary é baseada em OpenCV 2.X, se você quiser usar com o OpenCV 3.x, por favor, verifique nossa filial opencv3. O algoritmo PBAS foi removido da BGSLibrary porque é baseado no algoritmo patenteado ViBE. Alguns algoritmos da bgslibrary são gratuitos para fins comerciais e outros não. Primeiro você precisa entrar em contato com os autores do seu método de subtração de fundo desejado e verificar com eles a licença apropriada. Para obter mais informações, consulte: Posso usar um software GPLv3 como parte do meu aplicativo comercial. Se você usar esta biblioteca para suas publicações, por favor, cite como: Sobral, Andrews. BGSLibrary: Uma biblioteca de subtração de fundo OpenCV C. IX Workshop de Viso Computacional (WVC2017), Rio de Janeiro, Brasil, junho de 2017. PDF em português com resumo em inglês. Sobral, Andrews Bouwmans, Thierry. Biblioteca de BGS: uma estrutura da biblioteca para a avaliação dos algoritmos na segmentação do primeiro plano / do fundo. Capítulo no manual Background Modeling and Foreground Detection for Video Surveillance, CRC Press, Grupo Taylor and Francis, 2017. (PDF em inglês). Alguns algoritmos da BGSLibrary foram utilizados com sucesso nos seguintes trabalhos: (2017) Sobral, Andrews Vacavant, Antoine. Uma revisão abrangente dos algoritmos de subtração de fundo avaliados com vídeos sintéticos e reais. Visão Computacional e Imagem Compreensiva (CVIU), 2017. (PDF) (2017) Sobral, Andrews Oliveira, Luciano Schnitman, Leizer Souza, Felippe. (Best Paper Award) Estrada Congestionamento Traffic Classificação Usando Propriedades Holísticas. (Online) (PDF) Lista dos algoritmos disponíveis em BGSLibrary Algoritmo nome (clique para ver o código fonte) Confira a fonte do projeto mais recente (SPPRA2017), em Innsbruck, código. Leia as instruções no arquivo README. txt. Como usar a biblioteca BGS em outro código C Faça o download do código-fonte do projeto mais recente, copie o diretório packagebgs para o seu projeto e crie a pasta config (bgslibrary usa-o para armazenar arquivos de configuração xml). Para usuários do Windows, um projeto de demonstração para o Visual Studio 2018 é fornecido. Como contribuir com o projeto BGSLibrary Todos são convidados a cooperar com o projeto BGSLibrary enviando qualquer implementação de algoritmos de subtração de fundo (BS). Por favor, consulte o seguinte tutorial: github / andrewssobral / bgslibrary / blob / master / docs / bgslibraryhowtocontribute. pdf Lista completa de colaboradores da BGSLibrary Gostaria de agradecer a todos aqueles que contribuíram de alguma forma para o sucesso desta biblioteca, especialmente, os seguintes Ahmed Elgammal (EUA), Antoine Vacavant (França), Benjamin Laugraud (Bélgica), Csaba Kertsz (Finlândia), Domenico Bloisi (Itália), Donovan Parks (Canadá), Eduardo Barreto Alexandre Fia EL BAF (França), Iigo Martínez, Jean-Marc Odobez (Suíça), Jean-Philippe Jodoin (Canadá), JIA Pei (China), Jian Yao (China), Hemang Shah, Holger Friedrich, Laurence Bender Lionel Robinault (França), Luca Iocchi (Itália), Luiz Vitor Martinez Cardoso (Brasil), Martin Hofmann, Philipp Tiefenbacher e Gerhard Rigoll (Alemanha), Rim Trabelsi (Tunísia), Simone Gasparini (França), Stefano Tommesani Thierry Bouwmans (França), Vikas Reddy (Austrália), Yani Ioannou (Canadá), Zhenjie Zhao (China) e Zoran Zivkovic (Países Baixos). Versão 1.9.2: Adicionados os algoritmos SuBSENSE e LOBSTER de Pierre-Luc et al. (2017). Versão 1.9.1: Adicionado algoritmo de subtração de fundo Sigma-Delta (SigmaDeltaBGS) de Manzanera e Richefeu (2004). Versão 1.9.0: Adicionada uma nova estrutura para subtração de fundo usando várias pistas (SJNMultiCueBGS) de SeungJong Noh e Moongu Jeon (2017). Adicionado suporte OpenCV 2.4.8 (todas as dependências são vinculadas estaticamente). Versão 1.8.0: Adicionada Subtração multimodal de fundo independente (IMBS) de Domenico Daniele Bloisi (2017). Adicionado Adaptive-Selective Background Model Learning. Versão 1.7.0: Detecção de primeiro plano baseada em textura com MRF de Csaba Kertsz (2017). Algumas melhorias e correções de bugs. Versão 1.6.0: Adicionado KDE de A. Elgammal, D. Harwood, L. S. Davis, Modelo Não-paramétrico para Subtração de Fundo ECCV00 (graças a Elgammal). Subtração baseada em textura baseada em Marko Heikkila e Matti Pietikainen Um método baseado em textura para modelar o fundo e detectar objetos em movimento PAMI06. Adicionado suporte OpenCV 2.4.5, algumas melhorias e correções de bugs. Versão 1.5.0: Adicionado VuMeter de Yann Goyat, Thierry Chateau, Laurent Malaterre e Laurent Trassoudaine (graças a Antoine Vacavant). Adicionado OpenCV C MFC App (com código-fonte) usando a Biblioteca BGS para usuários do Windows. Adicionado suporte OpenCV 2.4.4 (todas as dependências são vinculadas estaticamente - bye DLLs), algumas melhorias e correções de bugs. Versão 1.4.0: Adicionado PBAS (Segmentador adaptativo baseado em pixel) de M. Hofmann, P. Tiefenbacher e G. Rigoll. Adicionado T2F-GMM com MRF de Zhenjie Zhao, Thierry Bouwmans, Xubo Zhang e Yongchun Fang. (Graças a Zhenjie Zhao e Thierry Bouwmans) GMG adicionado de A. Godbehere, A. Matsukawa, K. Goldberg (opencv nativo). Adicionado suporte OpenCV 2.4.3 (todas as dependências são vinculadas estaticamente - bye DLLs), algumas melhorias e correções de bugs. Versão 1.3.0: Adicionado Fuzzy Sugeno e Choquet Integral com Adaptive-Selective Background Model Atualização (graças a Thierry Bouwmans) Foreground Mask Analysis atualização, agora com número de True Positivos (TP), True Negatives (TN), Falso Positivos (FP) , Falso Negativo (FN), Taxa de Detecção, Precisão, Precisão, Precisão, Taxa de Falso Negativo (FNR), Taxa de Falso Positivo (FPR), True Positive Rate (TPR) e imagens ROC (graças a Thierry Bouwmans) Melhorias, correções de bugs. Versão 1.2.0: Adicionado BGS Multi-Camada (graças a Jian Yao e Jean-Marc Odobez) Adicionados Modelos de Subtração de Fundo de Laurence Bender (Gaussiano Simples, Gaussiano Fuzzy, Mistura de Gaussianos, SOM Adaptável e SOM Adaptável Fuzzy) (Similarity Measure) Versão 1.1.0: Adicionado Tipo 2-Fuzzy GMM UM e UV (graças a Thierry Bouwmans) Adicionado suporte para calcular tempo médio de algoritmos (ver param tictoc em ./config/FrameProcessor. xml) Versão 1.0.0: First Versão estável Adicionado 14 algoritmos de subtração de fundo (07 adaptados de Donovan Parks) Análise de Movimento e Rastreamento de Objetos cv :: calcOpticalFlowPyrLK void calcOpticalFlowPyrLK (const Mat amp prev1mg. Const Mat amp nextImg. Const vectorltPoint2fgtamp prevPts. VectorltPoint2fgtamp nextPts. Vectorltuchar gtamp status. Size winSizeSize (15.15), int maxLevel 3. TermCriteria criteriaTermCriteria (TermCriteria :: COUNTTermCriteria :: EPS.30, 0.01), double derivLambda0.5. Int flags0) Calcula o fluxo óptico para um conjunto de recursos esparsos usando o iterativo Lucas-Kanade Método com pirâmides prev1mg 8211 A primeira imagem de entrada de 8 bits de um canal ou de 3 canais nextImg 8211 A segunda imagem de entrada do mesmo tamanho e do mesmo tipo que prev1m 821 Vetor de pontos para os quais o fluxo precisa ser encontrado nextPts 8211 O vetor de saída de pontos contendo as novas posições calculadas das características de entrada no segundo status de imagem 8211 O vetor de status de saída. Cada elemento do vetor é definido como 1 se o fluxo para os recursos correspondentes foi encontrado, 0 caso contrário err 8211 O vetor de saída que irá conter a diferença entre remendos em torno do original e pontos movidos winSize 8211 Tamanho da janela de pesquisa em cada pirâmide Level maxLevel 8211 Número de nível de pirâmide máxima baseado em 0. Se 0, as pirâmides não são usadas (nível único), se 1, dois níveis são usados ​​etc. critérios 8211 Especifica os critérios de terminação do algoritmo de pesquisa iterativo (após o número máximo especificado de iterações criteria. maxCount ou quando a janela de pesquisa se move por Menos do que os critérios. epsilon derivLambda 8211 O peso relativo das imagens espaciais impacto impacto para a estimativa de fluxo óptico. Se derivLambda0 apenas a intensidade da imagem é utilizada, se derivLambda1 apenas derivados são usados. Outros valores entre 0 e 1 significa que ambos Os derivados e a intensidade da imagem são utilizados (nas proporções correspondentes) flags 8211 Os sinalizadores de operação: A função implementa a versão iterativa esparsa do fluxo óptico de Lucas-Kanade em pirâmides, veja Bouguet00. Cv :: calcOpticalFlowFarnebackMultiple cameras with the Raspberry Pi and OpenCV I8217ll manter a introdução para today8217s post curto, uma vez que eu acho que o título deste post e animação GIF acima falam por si mesmos. Em este post, I8217ll demonstrar como anexar várias câmeras para o seu Pi8230 Raspberry e acesso a todos eles usando um único Python Script. Independentemente se sua configuração inclui: Várias webcams USB. Ou o módulo de câmera Raspberry Pi adicionais câmeras USB 8230 8230 o código detalhado nesta postagem permitirá que você acessa todos os seus fluxos de vídeo 8212 e detecção de movimento em cada um deles Melhor de tudo, a nossa implementação de acesso de câmera múltipla com o Raspberry Pi e OpenCV É capaz de executar em tempo real (ou quase em tempo real, dependendo do número de câmeras que você tem anexado), tornando-o perfeito para criar o seu próprio sistema de vigilância casa multi-câmera. Continue lendo para aprender mais. Várias câmeras com o Raspberry Pi e OpenCV Ao construir uma configuração Raspberry Pi para alavancar várias câmeras, você tem duas opções: Basta usar várias câmeras USB. Ou use um módulo de câmera Raspberry Pi e pelo menos uma câmera web USB. A placa Raspberry Pi tem apenas uma porta da câmera. Assim você não será capaz de usar vários Raspberry Pi câmera placas (a menos que você deseja executar alguns hacks extensa para o seu Pi). Assim, para anexar várias câmeras ao seu Pi, você precisa aproveitar pelo menos uma (se não mais) câmeras USB. Dito isto, a fim de construir a minha própria câmera multi-Framboesa Pi configuração, eu acabei usando: A Framboesa Pi câmara câmera módulo de habitação (opcional). Podemos interagir com a câmera usando o pacote picamera Python ou (preferencialmente) a classe VideoStream segmentada definida em uma postagem anterior do blog. Uma webcam Logitech C920 que é plug-and-play compatível com o Raspberry Pi. Podemos acessar esta câmera usando o cv2. VideoCapture função integrada para OpenCV ou a classe VideoStream desta lição. Você pode ver um exemplo da minha configuração abaixo: Figura 1: Minha câmera múltipla Raspberry Pi configuração. Aqui podemos ver meu Raspberry Pi 2, juntamente com o módulo de câmera Raspberry Pi (sentado em cima do Pi 2) e minha webcam Logitech C920. O módulo da câmera Framboesa Pi está apontando para a porta do meu apartamento para monitorar quem está entrando e saindo, enquanto a webcam USB é apontada para a cozinha, observando qualquer atividade que possa estar acontecendo: Figura 2: O módulo de câmera Raspberry Pi e câmera USB São ambos ligados ao meu Raspberry Pi, mas estão monitorando diferentes áreas da sala. Ignore a fita e o cartão elétricos na câmera de USB 8212 isto era de uma experiência precedente que deve (esperançosamente) ser publicada no blog de PyImageSearch logo. Finalmente, você pode ver um exemplo de ambos os feeds de vídeo exibidos para o meu Raspberry Pi na imagem abaixo: Figura 3: Um exemplo de captura de tela de monitoramento de ambos os feeds de vídeo a partir da instalação de várias câmeras Raspberry Pi. No restante desta postagem no blog, we8217ll define uma classe de detecção de movimento simples que pode detectar se uma pessoa / objeto está se movendo no campo de visão de uma determinada câmera. We8217ll, em seguida, escrever um script de driver Python que instancia nossos dois fluxos de vídeo e executa a detecção de movimento em ambos. Como podemos ver, usando as classes de captura de fluxo de vídeo encadeadas (onde um segmento por câmera é dedicado para executar operações de E / S, permitindo que o segmento do programa principal continue desbloqueado), podemos facilmente obter nossos detectores de movimento para várias câmeras para serem executadas Em tempo real na Raspberry Pi 2. Let8217s ir em frente e começar a definir a classe de detector de movimento simples. Definindo o nosso detector de movimento simples Nesta seção, we8217ll construir uma classe Python simples que pode ser usado para detectar movimento em um campo de visão de uma determinada câmera. Para eficiência, essa classe assumirá que há apenas um objeto movendo-se na visão da câmera 8212 em postagens de blog futuras, veremos métodos mais avançados de detecção de movimento e subtração de fundo para rastrear vários objetos. De fato, já analisamos parcialmente este método de detecção de movimento em nossa lição anterior, vigilância domiciliar e detecção de movimento com o Raspberry Pi, Python, OpenCV e Dropbox 8212, estamos agora formalizando essa implementação em uma classe reutilizável em vez de apenas em linha código. Let8217s começ começado abrindo um arquivo novo, nomeando o basicmotiondetector. Py. E adicionando no seguinte código: Várias câmeras com o Raspberry Pi e OpenCV Chamando cv2. Utilizando o valor fornecido de deltaThresh permite-nos binarizar a imagem delta, que, em seguida, encontrar contornos em (Linhas 37-45). Nota: Tome especial cuidado ao examinar as linhas 43-45. Como sabemos, o cv2. O método findContours retorna a assinatura alterada entre OpenCV 2.4 e 3. Este codeblock nos permite usar cv2. FindContours em ambos os OpenCV 2.4 e 3 sem ter que mudar uma linha de código (ou se preocupar com problemas de controle de versão). Finalmente, linhas 48-52 loop sobre os contornos detectados, verifique se a sua área é maior do que o minArea fornecido. E se assim for, atualiza a lista locs. A lista de contornos contendo movimento é então retornada ao método de chamada na Linha 55. Nota: Novamente, para uma revisão mais detalhada do algoritmo de detecção de movimento, consulte o tutorial de vigilância em casa. Acessando várias câmeras no Raspberry Pi Agora que nossa classe BasicMotionDetector foi definida, agora estamos prontos para criar o multicammotion. Py para acessar as várias câmeras com o Raspberry Pi 8212 e aplicar a detecção de movimento a cada um dos fluxos de vídeo. Let8217s vá em frente e começar a definir o nosso script de driver: Várias câmeras com o Raspberry Pi e OpenCV Onde o parâmetro src controla o índice da câmera em sua máquina. Note também que you8217ll tem que substituir webcam e picam com webcam1 e webcam2. Respectivamente em todo o resto deste script também. Finalmente, as Linhas 19 e 20 instanciam dois BasicMotionDetector 8216s, um para a câmera USB e um segundo para o módulo de câmera Raspberry Pi. Agora estamos prontos para realizar a detecção de movimento em ambos os feeds de vídeo: Várias câmeras com o Raspberry Pi e OpenCV I incluíram uma série de 8220caixeiros de luz de fundo8221 no seguinte GIF que demonstra nosso detector de movimento multi-câmera em ação: Figura 4: Um exemplo de Aplicando detecção de movimento para várias câmeras usando o Raspberry Pi, OpenCV e Python. Observe como eu começo na cozinha, abro um armário, alcanço para uma caneca, e dirijo-me à pia para encher a caneca com água 8212 esta série de ações e movimento são detectados na primeira câmera. Finalmente, eu cabeça para a lata de lixo para jogar fora uma toalha de papel antes de sair da vista de quadro da segunda câmera. Um demo de vídeo completo de acesso de câmera múltipla usando o Raspberry Pi pode ser visto abaixo: Resumo Nesta postagem no blog, aprendemos como acessar várias câmeras usando o Raspberry Pi 2, OpenCV e Python. Ao acessar várias câmeras no Raspberry Pi, você tem duas opções ao construir sua configuração: Ou usar várias webcams USB. Ou usando um único módulo de câmera Raspberry Pi e pelo menos uma webcam USB. Desde a placa Pi Framboesa tem apenas uma entrada de câmera, você não pode alavancar várias placas de câmera Pi 8212 atleast sem hacks extensa para o seu Pi. A fim de proporcionar uma implementação interessante do acesso de múltiplas câmeras com o Raspberry Pi, criamos uma classe de detecção de movimento simples que pode ser usado para detectar movimento nas vistas de quadros de cada câmera conectada ao Pi. Embora básico, este detector de movimento demonstrou que o acesso de múltiplas câmeras é capaz de ser executado em tempo real no Raspberry Pi 8212 especialmente com a ajuda de nossas classes de PiVideoStream e VideoStream segmentadas implementadas em posts há algumas semanas. Se você estiver interessado em aprender mais sobre o uso do Pi da framboesa para a visão por computador, juntamente com outras dicas, truques e hacks relacionados ao OpenCV, não se esqueça de se inscrever para o boletim informativo PyImageSearch usando o formulário na parte inferior desta postagem. Até a próxima semana Downloads: Guia de Recursos (é totalmente grátis). Insira o seu endereço de e-mail abaixo para obter o meu Guia de Recursos de Pesquisa de Imagem de 11 páginas gratuito PDF. Descobrir técnicas exclusivas que eu não publicar neste blog e começar a construir motores de busca de imagem do seu próprio Phil 19 de janeiro de 2017 at 7:32 am Oi Adrian, obrigado por outro grande tutorial. Até agora, eu estava executando o OpenCV no meu Raspberry Pi, conectado à GUI. Eu só tentei inicializar o Pi para o console em vez disso e em execução qualquer projeto OpenCV que usa 8216imread8217, recebo um erro GTK 8211 8216gtk aviso não pode abrir display8217. Eu li que isso é algo a ver com o servidor X11. Você já tentou OpenCV quando inicializado no console em vez da GUI Basicamente, eu gostaria de ser capaz de iniciar o meu projeto, logo que o Pi arranque e imaginou que seria um desperdício de recursos com a interface gráfica executando em segundo plano. Adrian Rosebrock January 20, 2017 at 1:50 pm De fato, sempre que você quiser usar o método cv2.imshow, you8217ll precisa ter um servidor de janela em execução (como X11). Se você quiser iniciar um script Python no boot e tê-lo executado em segundo plano, basta comentar todas as suas cv2.imshow e cv2.waitKey chamadas e seu programa será executado muito bem. Girish janeiro 19, 2017 at 10:25 pm Grande trabalho, muito obrigado por compartilhar o código, eu implementei este código e testei-lo. Eu posso vê-lo trabalhar, mas eu vejo uma mensagem de erro na janela de comando que só diz 8220select tempo out8221. Podemos ignorar isso ou há uma maneira de corrigir este BTW você viu este erro em sua implementação Adrian Rosebrock 20 de janeiro de 2017 at 1:48 pm Eu não vi essa mensagem de erro antes. Parece ser um erro relacionado a E / S, talvez com o Python acessando a câmera Pi Framboesa Girish 21 de janeiro de 2017 às 1:58 am Obrigado pela sua resposta, eu corri o código que você tinha publicado por muito tempo e funcionou bem, o pensamento Estou vendo a mensagem 8221 Selecione o tempo out8221 ele não parece estar afetando a função (pode ser deixar cair quadros, mas não tenho certeza) ainda funciona bem com duas Webcams Logictec C170. Eu não tenho Pi Câmeras. (Eu não sei por que você não está vendo esta mensagem.) Mais uma vez, ótimo trabalho, post fantástico, muito obrigado por compartilhar seu código, vou executar o código com mais tempo integrar minhas próprias rotinas de processamento de imagem e ver como ele vai Adrian Rosebrock 21 de janeiro de 2017 às 5:00 Stil Eu vejo a mensagem 8220Select Timeout8221 meu selvagem acho que pode ser devido ao sistema operacional ou os drivers USB / Webcam rodando no meu RPi, você pode compartilhar qual o modelo de RPi que você está usando o que Linux imagem que você está usando, para que eu possa replicar a configuração exata que você tem e dar-lhe uma tentativa Outra diferença que eu posso pensar é, estou usando C170 Logitech câmera não tenho certeza que isso vai fazer a diferença ou não Bolkar 20 de janeiro de 2017 em 2:44 am Obrigado pelo post muito legal. Seria possível usar câmeras ip que eu já implantou algumas delas em um dvr regular. Seria muito interessante aplicar isso em uma configuração ip. Adrian Rosebrock 20 de janeiro de 2017 às 1:43 pm amancio 23 de janeiro de 2017 às 2:16 pm Hey Adrian, seu múltiplo-cameras8211rpi não exibe as imagens no meu monitor, porém, um programa separado para apenas capturar a imagem e exibir imediatamente a imagem Usando cv2.imgshow funciona. Eu olhei ao redor na rede e tenho visto casos em que as pessoas reclamaram que cv2.imgshow não atualizar a janela properly8230 Tem alguma idéia de por que seu script não funciona Obrigado Adrian Rosebrock 25 de janeiro de 2017 at 4:14 pm Como seu Outro comentário mencionado, você precisa usar o método cv2.waitKey, que o script Python inclui na Linha 82. Mike Grainger 2 de abril de 2017 às 9h40 Por favor, continue com esses blogs estou encontrando-os muito educacionais. Minha pergunta, você faz uma referência a um 8216multi-objeto tracking8217 tutorial que vem no futuro. Gostaria de adicionar um a esse artigo na esperança de que ele vai pousar mais alto em sua lista de prioridades. Para esse fim, você tem uma idéia quando você estará lançando um tal artigo Adrian Rosebrock 3 de abril de 2017 às 10:28 Hey Mike 8212 obrigado por sugerir rastreamento multi-objeto. Vou fazer um tutorial sobre ele, mas para ser honesto, não tenho certeza exatamente quando isso será. I8217ll não se esqueça de mantê-lo no loop Comentários como estes me ajudam a priorizar posts, por isso obrigado por Glenn 3 de abril de 2017 em 1:09 am Quando eu executar este script meu pi reinicia. Eu era capaz de obter ambas as câmeras para ligar por uma fração de segundo, mas, em seguida, o pi desliga muito rapidamente. Alguma idéia do que poderia estar acontecendo Adrian Rosebrock 3 de abril de 2017 às 10:22 am That8217s bastante estranho, I8217m não sei qual é o problema. Parece que as câmeras podem estar desenhando muito poder e o Pi está fechando Você pode querer postar nos fóruns oficiais de Raspberry Pi e ver se eles têm alguma sugestão. Meu contexto não é exatamente o mesmo desde que eu uso a interface C do OpenCV, e eu estou usando o Linux em um PC (mas eu pretendo ir em Raspberry Pi depois). Eu tenho um problema usando várias câmeras embora e eu esperava que você teria algumas pistas sobre a causa para isso. O problema é que eu não consigo abrir 2 câmeras USB ao mesmo tempo sem ter um erro de video4linux (a API de Linux8217s para webcams, em que o OpenCV depende, ou então eu entendo). Do you have any clues Adrian Rosebrock May 10, 2017 at 6:22 pm Hey William, thanks for the comment. I8217ve never tried to use the C interface to access multiple cameras before, so I8217m unfortunately not sure what the error is. However, it seems like the same logic should apply. You should be able to create two separate pointers, where each points to the different USB camera src. James May 25, 2017 at 4:31 pm I8217m having a problem installing cv2. I have openCV installed, but cv2 still cannot be found on the Pi. Any suggestions Adrian Rosebrock May 27, 2017 at 1:36 pm Please refer to the 8220Troubleshooting8221 section of this post for information on debugging your OpenCV install.

No comments:

Post a Comment