Sistema de tracking para inserção dinâmica de linha de
impedimento em vídeos de jogos de futebol
Rodrigo Busato SartorOrientador: Paulo César Rodacki Gomes
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Introdução
• Impedimento • Detecção de objetos em movimento• Tracking• Realce das linhas do campo
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Objetivos
• Desenvolver os passos iniciais para inserção da linha de impedimento em vídeos de jogos de futebol
• Identificar as linhas que delimitam o campo, incluindo a pequena e grande área.
• Realizar o acompanhamento dos jogadores através de técnicas de tracking.
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Fundamentação teórica• Posição de impedimento• Detecção de objetos em movimentos
– Tracking– Objetos em movimento– Optical flow
• Filtros de Imagem– Imagens de vídeo
• Realce de linhas– Passa-alta– Passa-baixa– Limiarização (threshold)
Fundamentação teórica
Posição de impedimento• A lei 11 do livro de regras do futebol rege
que:
“Um jogador estará em posição de impedimento quando se encontrar mais próximo da linha de meta adversária do que a bola e o penúltimo adversário”
Fundamentação teórica
Posição de impedimento
Fundamentação teóricaDetecção de objetos em movimentos
• Tracking– É um registro especial de imagens onde
procura-se um objeto dado em uma imagem dada
– O espaço de busca é limitado, pois é considerado que objeto tenha uma trajetória continua.
Fundamentação teóricaDetecção de objetos em movimentos
• Tracking (continuação...)– Muitos sistemas de tracking utilizam como
passo inicial a detecção dos movimentos (optical flow)
– Após a detecção do movimento podem ser utilizadas algumas técnicas como a segmentação adaptativa para realizar o optical flow apenas na área de interesse
Fundamentação teóricaDetecção de objetos em movimentos
• Objetos em movimento– Uma das maneiras mais simples de realizar a
detecção dos movimentos, é a comparação pixel por pixel, o que gera uma imagem binaria, onde na comparação entre os frames os pixels que tiverem uma diferença significativa, ficam em branco, e o restante em preto
Fundamentação teóricaDetecção de objetos em movimentos
• Optical flow– Fornece meios de determinar e representar o
movimento dentro de uma sequencia de imagens
– Quando é detectado movimento em um pixel toda região em sua volta é examinada
– O tamanho da área examinada é determinada pelo tamanho da aceleração máxima tanto para x quanto para y
Fundamentação teóricaDetecção de objetos em movimentos
• Optical flow (continuação...)– A área é analisada de dentro para fora partindo
do pixel central até encontrar um pixel correspondente
– Após a detecção do movimento, pode ser previsto a posição esperada do pixel no próximo frame
– A localização do pixel no próximo frame é dada pela soma da posição atual mais a diferença entre a posição atua e a posição anterior. Tanto para o eixo “x” quanto para o eixo “y”
Fundamentação teóricaFiltros de imagem
• Imagens de vídeo– Um vídeo é uma sequência S de imagens It,
onde It indica a imagem no tempo t do vídeo– Uma imagem I pode ser representada pela
funçãoI : D⊂ℜ² →ℜn
– Onde D é o domínio da imagem e n é um número escalar para representar a cor de um pixel qualquer
– geralmente um byte ou seja de 0 a 255
Fundamentação teóricaFiltros de imagem• Representação da imagem de um vídeo
Fundamentação teóricaFiltros de imagem
• Realce de linhas– É realizado para detectar pontos candidato a
estarem sobre os segmentos de retas presentes na imagem
Fundamentação teóricaFiltros de imagem
• Passa-alta– Funciona mantendo os trechos de alta
frequência e eliminando as baixas, sendo utilizado para detectar as bordas da imagem
– Pode ser utilizado o algoritmo laplaciano que é definido pelo operado matemático ∇.
– Devido à interferência, o laplaciano mantem pontos que possuem frequência alta, mais não pertencem a imagem
Fundamentação teóricaFiltros de imagem
• Passa-alta (continuação...)
Fundamentação teóricaFiltros de imagem
• Passa-baixa– Funciona mantendo os trechos de baixa
frequência e eliminando as altas, sendo utilizado para reduzir as interferências ocasionadas por exemplo pela transmissão da TV
– Pode ser utilizado o algoritmo de gaussiano
Fundamentação teóricaFiltros de imagem
• Passa-baixa (continuação...)
Fundamentação teóricaFiltros de imagem
• A junção do algoritmo laplaciano e gaussiano é descrito como algoritmo laplaciano da gaussiana ou simplesmente LoG
Fundamentação teóricaFiltros de imagem
• Laplassiano da gaussiana (continuação...)
Fundamentação teóricaFiltros de imagem
• Limiarização (threshold)– O principio da limiarização consiste em separar
de uma imagem em duas classes (o fundo e o objeto). Produzindo ao seu final uma imagem binaria
– A forma mais simples de limiarização consiste na bipartição do histograma, convertendo os pixels cujo tom de cinza é maior ou igual a um certo valor limiar em branco e os demais em pretos
Fundamentação teóricaFiltros de imagem
• Limiarização (threshold) (continuação...)
Fundamentação teórica
Trabalhos correlatos• Calibração de câmeras para cálculo de
impedimentos (FURB, 2003)• Ambiente virtual tridimensional para cálculo de
impedimento (FURB, 2004)• Acompanhamento de cenas com calibração
automática de câmeras (PUC-RJ, 2001)
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Desenvolvimento
• Especificação– Requisitos– Caso de uso– Diagrama de classes – Diagrama de sequência
• Implementação– Ferramentas e técnicas– Principais funcionalidades
Desenvolvimento
Principais requisitos• Fncionais
– Permitir inserir um vídeo de uma partida de futebol;– Disponibilizar o vídeo para visualização com o rastreamento
de jogadores;– Disponibilizar o vídeo para visualização com o realce de
linhas;• Não funcionais
– O protótipo será desenvolvido na linguagem de programação Java, no ambiente de desenvolvimento Eclipse;
– O protótipo será desenvolvido utilizando framework Java Media Framework (JMF);
– O protótipo executará o vídeo gerado sem atrasos ou falhas de reprodução.
Desenvolvimento
Casos de uso uc Use Case Model
UsuárioGerar linha de impedimento
Informar v ídeo contendo um jogo de
futebol
Desenvolvimento
Diagrama de classes class Class Model
WeightedBlobCorrelator
- confidence: double ([][])- hcNew: int- hcOld: int- infoWeight: double ([])- minCorrelationConfidence: double = NO_CONFIDENCE- nextLabel : int = 1- NO_CONFIDENCE: double = -Double.MAX_VALUE {readOnly}- prevNow: double = 0.0
- calcAllConfidences(List<Blob>, List<Blob>) : void- calculateConfidence(Blob, Blob) : double+ correlate(List<Blob>, List<Blob>) : List<Blob>- correlate(Blob, Blob) : Blob- findHighestConfidence(List<Blob>, List<Blob>) : double+ WeightedBlobCorrelator()
«interface»BlobCorrelator
+ correlate(List<Blob>, List<Blob>) : List<Blob>
BlobManager
- blobAgeOfAcceptance: double- correlatedBlobList: List<Blob>- correlator: BlobCorrelator- listeners: List<BlobManagerListener>- maxBlobMissingTime: double- uncorrelatedBlobList: List<Blob>- videoSize: Dimension
+ addListener(BlobManagerListener) : void+ BlobManager()+ getBlobAgeOfAcceptance() : double+ getBlobList() : List<Blob>+ getMaxBlobMissingTime() : double+ getUncorrelatedBlobList() : List<Blob>+ getVideoSize() : Dimension+ removeListener(BlobManagerListener) : void- removeOldBlobs() : void+ setBlobAgeOfAcceptance(double) : void+ setMaxBlobMissingTime(double) : void+ setVideoSize(Dimension) : void+ updateBlobs(List<Blob>) : void
Blob
+ bounds: Rectangle+ frameLabel: int+ frameNumber: int+ label: int+ NOT_CORRELATED: int = -1 {readOnly}+ pixelCount: int+ timeCreated: double+ timeLastUpdated: double+ timeMissing: double+ velocity: Point2D.Double
+ Blob(int, Rectangle)
EffectCodecVideo
- active: boolean# displayImage: BufferedImage- frameListenerList: List<VideoFrameListener>- input: Format = null- nCalls: long- output: Format = null+ PROP_VIDEO_SIZE: String = "videoSize" {readOnly}- propSupport: PropertyChangeSupport = new PropertyCha...# supportedIns: Format ([]) = new Format[] { ...# supportedOuts: Format ([]) = new Format[] { ...- totalT ime: double- videoSize: Dimension = new Dimension()
+ addVideoFrameListener(VideoFrameListener) : void+ close() : void+ CodecVideo()+ getAvgProcessingTime() : double+ getControl(String) : Object+ getControls() : Object[]+ getDisplayImage() : BufferedImage+ getName() : String+ getSupportedInputFormats() : Format[]+ getSupportedOutputFormats(Format) : Format[]+ getVideoSize() : Dimension+ isActive() : boolean- notifyVideoFrameListeners() : void+ open() : void+ process(Buffer, Buffer) : int# processRGB(byte[], byte[], VideoFormat) : boolean+ removeVideoFrameListener(VideoFrameListener) : void+ reset() : void+ setActive(boolean) : void+ setInputFormat(Format) : Format+ setOutputFormat(Format) : Format# updateImage(byte[], VideoFormat) : void
JFrameControllerListener
VirtualFlag
# backgroundUpdater: BackgroundUpdater# blobManager: BlobManager# bufferAccessor: BufferAccessor- effectChain: CodecVideo ([])- processor: Processor- stateTransitionOK: boolean = true- waitSync: Object = new Object()
+ controllerUpdate(ControllerEvent) : void# createEffectChain() : CodecVideo[]+ getEffect(Class<? extends RgbVideoEffect>) : CodecVideo+ getMediaLocator() : MediaLocator+ getProcessingChain() : CodecVideo[]- initConponents() : void+ main(String[]) : void+ menu() : JMenuBar+ open(MediaLocator) : boolean+ VirtualFlag()~ waitForState(int) : boolean
+correlator
#blobManager
-effectChain
Desenvolvimento
Diagrama de classes class Class Model
BlobDetector
- blobManager: BlobManager- changeLabel: int ([]) = new int[MAX_LAB...- format: VideoFormat- frameNumber: int = -1- labelImage: int ([]) = new int[0]+ MAX_LABELS: int = 320 * 240 / 4 {readOnly}- maxBlobSize: int = Integer.MAX_VALUE- minBlobSize: int = 16
+ BlobDetector(BlobManager, int, int, int)- checkNeighborLabel(VideoFormat, int, int) : int- compressLabelEquivalences(int) : void- createBlobList(VideoFormat, int, int) : List<Blob>- doLabel ing(byte[], VideoFormat, int) : int- fi lterBlobsBySize(List<Blob>) : List<Blob>+ getCurrentFrameNumber() : int+ getLastLabelImage() : int[]+ getLastLabelImageSize() : Dimension+ getMaxBlobSize() : int+ getMinBlobSize() : int+ getName() : String- ini tFrame(VideoFormat) : int- makeLabelsContiguous(int) : int# processRGB(byte[], byte[], VideoFormat) : boolean- resolveLabelEquivalences(byte[], VideoFormat, int) : void+ setMaxBlobSize(int) : void+ setMinBlobSize(int) : void# updateImage(byte[], VideoFormat) : void- updateNeighbor(int, int) : void
FilterLoG
- bti: BufferToImage~ first: boolean = true
- convolveImagem(BufferedImage, double[][]) : double[]+ cruzaZero(double[][], BufferedImage) : void- distancia(double, double, double, double) : double+ fil terExecute(double, BufferedImage) : void+ Fi lterLoG()- funcLoG(double, double) : double- gauss(double, double) : double
BackgroundUpdater
- background: byte ([]) = nul l- BACKGROUND_GRAB_TIME: int = 1 {readOnly}- buffAcc: BufferAccessor- frameNumber: long = 0
+ BackgroundUpdater(BufferAccessor)+ getBackground() : byte[]+ getName() : String+ isCapturing() : boolean# processRGB(byte[], byte[], VideoFormat) : boolean+ resetBackground() : void# updateImage(byte[], VideoFormat) : void
BufferAccessor
- buffer: byte ([])- size: Dimension
+ BufferAccessor()+ getBuffer() : byte[]+ getBufferSize() : Dimension+ getName() : String# processRGB(byte[], byte[], VideoFormat) : boolean# updateImage(byte[], VideoFormat) : void
DifferenceInputBackground
- bgUpdater: BackgroundUpdater
+ DifferenceInputBackground(BackgroundUpdater)+ getName() : String# processRGB(byte[], byte[], VideoFormat) : boolean
ThresholdEffect
# passCount: int# passRatio: float# threshold: char = 64
+ getName() : String+ getPassCount() : int+ getPassRatio() : float+ getThreshold() : char# processRGB(byte[], byte[], VideoFormat) : boolean+ setThreshold(char) : void+ ThresholdEffect()# updateImage(byte[], VideoFormat) : void
EffectCodecVideo
- active: boolean# displayImage: BufferedImage- frameListenerList: List<VideoFrameListener>- input: Format = nul l- nCal ls: long- output: Format = nul l+ PROP_VIDEO_SIZE: String = "videoSize" {readOnly}- propSupport: PropertyChangeSupport = new PropertyCha...# supportedIns: Format ([]) = new Format[] { ...# supportedOuts: Format ([]) = new Format[] { ...- totalTime: double- videoSize: Dimension = new Dimension()
+ addVideoFrameListener(VideoFrameListener) : void+ close() : void+ CodecVideo()+ getAvgProcessingTime() : double+ getControl(String) : Object+ getControls() : Object[]+ getDisplayImage() : BufferedImage+ getName() : String+ getSupportedInputFormats() : Format[]+ getSupportedOutputFormats(Format) : Format[]+ getVideoSize() : Dimension+ isActive() : boolean- notifyVideoFrameListeners() : void+ open() : void+ process(Buffer, Buffer) : int# processRGB(byte[], byte[], VideoFormat) : boolean+ removeVideoFrameListener(VideoFrameListener) : void+ reset() : void+ setActive(boolean) : void+ setInputFormat(Format) : Format+ setOutputFormat(Format) : Format# updateImage(byte[], VideoFormat) : void
-bgUpdater
-buffAcc
Desenvolvimento
Diagrama de sequencia
Desenvolvimento
Ferramentas e técnicas• Linguagem Java versão 6.0• API Java Media Framework (JMF)• IDE Eclipse Helios
Desenvolvimento
Principais funcionalidades• Carregar vídeo
Desenvolvimento
Principais funcionalidades• Vídeo executando reconhecimento de movimentos
Desenvolvimento
Principais funcionalidades• Vídeo executando realce de linhas
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Resultados e discussões
• Rastreamento dos jogadores com visualização dinâmica
• É necessário refinar a solução• O rastreamento considerou objetos do
fundo da cena (tais como placas de propaganda)
• Foi feito pré-processamento gráfico para detecção de linhas mais faltou implementação de reconhecimento, classificação e cálculo de homografia
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Conclusão
• Não foi possível a atender todos os objetivos propostos por terem se tornado demasiadamente complexos, para o período de desenvolvimento
• O trabalho implementou tracking para jogos de futebol, mais ainda necessita refinamento
• Pode ser agregado a trabalhos correlatos para a continuação da linha de pesquisa
Roteiro
• Introdução• Objetivos• Fundamentação teórica• Desenvolvimento• Resultados e discussões• Conclusão• Extensões
Extensões
• Melhoria no rastreamento de jogadores• Implementação de reconhecimento de linhas
e cálculo de homografia (calibração de câmeras)
• Implementação de inserção da linha de impedimento
• Um sistema estático utilizando o rastreamento dos jogadores para verificar a distancia percorrida, área que mais atuou entre outros dados
Apresentação do protótipo