Escolar Documentos
Profissional Documentos
Cultura Documentos
Palmas – TO
2015
Leomar Camargo de Souza
AVALIAÇÃO ANTROPOMÉTRICA ATRAVÉS DA DELIMITAÇÃO DA SILHUETA
CORPORAL UTILIZANDO O KINECT
Palmas – TO
2015
Leomar Camargo de Souza
AVALIAÇÃO ANTROPOMÉTRICA ATRAVÉS DA DELIMITAÇÃO DA SILHUETA
CORPORAL UTILIZANDO O KINECT
BANCA EXAMINADORA
___________________________________________________
Prof. M.Sc. Fabiano Fagundes
Centro Universitário Luterano de Palmas - CEULP
___________________________________________________
Prof. M.Sc. Fernando Luiz de Oliveira
Centro Universitário Luterano de Palmas - CEULP
___________________________________________________
Prof. M.Sc. Pierre Soares Brandão
Centro Universitário Luterano de Palmas - CEULP
Palmas - TO
2015
Aos meus pais e minha irmã que, cоm muito
apoio, nãо mediram esforços para que eu
chegasse até esta etapa de minha vida.
AGRADECIMENTOS
Aos meus pais, minha irmã e minha avó, apenas posso agradecer por tudo que me
proporcionaram, pois nunca conseguirei compensar devidamente a dedicação que sempre
manifestaram.
Ao meu orientador, Fabiano Fagundes, agradeço por tudo que me ensinou, pela
paciência, pela insistência, pelas cobranças, pelos conselhos, por ter mostrado a minha real
capacidade quando eu menos acreditava.
Aos professores da banca, Pierre Brandão e Fernando Luiz, agradeço pelas
contribuições, pois cada dica foi de grande relevância para todos os trabalhos desenvolvidos ao
longo do curso.
Aos professores Jackson, Madianita, Cristina, Parcilene e Edeilson, agradeço por todo
conhecimento proporcionado e por mostrarem que os cursos de Ciência da Computação e
Sistemas de Informação do Centro Universitário Luterano de Palmas não possuem apenas um
grupo de professores e sim, uma família de professores extremamente dedicada.
A Rayssa Leão - que sem sombra de dúvidas é uma das pessoas mais incríveis que
conheci - agradeço em especial pelas conversas, conselhos, zoeiras e apoio até aqui.
Também não posso deixar de mencionar outros nomes fundamentais nessa jornada. São
eles: Jesiel Padilha, Jhonatan Mota, Ranyelson Neres, Marcus Germano, João Neto, João Elias,
Jackeline Miranda e Thiago Mendes.
Enfim, agradeço a todos os amigos e colegas por cada momento que passamos juntos.
Espero que continuem presentes nessa nova jornada que está por vir. Muito obrigado!
RESUMO
Tabela 1. Média e desvio padrão dos dados coletados por Lima (2015).................................. 55
LISTA DE FÓRMULAS E EQUAÇÕES
1 INTRODUÇÃO ................................................................................................................ 14
2 REFERENCIAL TEÓRICO ............................................................................................. 16
2.1 Anatomia humana ..................................................................................................... 16
2.1.1 Divisão do corpo humano ..................................................................................... 17
2.1.2 Posição anatômica e plano anatômico .................................................................. 18
2.1.3 Planos de secção e termos de referências ............................................................. 19
2.1.3.1 Plano sagital .................................................................................................. 20
2.2 Processamento digital de imagens ............................................................................ 21
2.2.1 Imagem digital ...................................................................................................... 24
2.2.1.1 Imagem binária ................................................................................................. 25
2.2.1.2 Imagem em tons de cinza ............................................................................. 25
2.2.1.3 Imagem colorida ........................................................................................... 25
2.2.2 Segmentação ......................................................................................................... 26
2.2.2.1 Descontinuidade ........................................................................................... 26
2.2.2.2 Transformada de Hough ............................................................................... 27
2.2.2.3 Limiarização ................................................................................................. 27
2.3 Recursos do Kinect para o processamento de imagens ............................................ 28
3 METODOLOGIA............................................................................................................. 30
3.1 Desenho de estudo .................................................................................................... 30
3.2 Local e período de realização do estudo ................................................................... 30
3.3 Hardware .................................................................................................................. 30
3.4 Linguagem de programação e softwares .................................................................. 31
3.5 Desenvolvimento do software .................................................................................. 31
3.6 Panorama do software desenvolvido ........................................................................ 32
3.6.1 Arquitetura do software ........................................................................................ 32
3.6.2 A plataforma FisioKinect ..................................................................................... 33
3.7 Testes e elaboração do protocolo.............................................................................. 34
4 RESULTADOS E DISCUSSÕES .................................................................................... 35
4.1 O software ................................................................................................................ 35
4.2 Lógica utilizada para o cálculo dos atributos antropométricos ................................ 37
4.2.1 Joints utilizados pelo segmento Mb ...................................................................... 38
4.3 Processo de localização dos segmentos Mb e Mp e cálculo da proporção ................ 38
4.3.1 Orientação dos segmentos ................................................................................ 40
4.4 Detalhe da captura .................................................................................................... 41
4.5 Desenvolvimento do software .................................................................................. 41
4.5.1 Arquitetura de desenvolvimento ........................................................................... 41
4.5.2 Declaração de variáveis ........................................................................................ 41
4.5.2.1 Inicialização e configuração do Kinect e da limiarização ............................ 42
4.5.3 Mensuração dos atributos antropométricos .......................................................... 45
4.5.3.1 Método de localização do maior segmento Mb ............................................ 49
4.5.3.2 Localização do segmento Mp para a estatura................................................ 50
4.6 Testando o software .................................................................................................. 52
4.6.1 Protocolo de avaliação .......................................................................................... 53
4.6.1.1 Estatura e largura do ombro.......................................................................... 53
4.6.1.2 Largura do quadril ........................................................................................ 54
4.6.2 Comparativo entre a mensuração através do software e do método tradicional .. 55
5 CONSIDERAÇÕES FINAIS ........................................................................................... 57
REFERÊNCIAS ....................................................................................................................... 59
APÊNDICES ............................................................................................................................ 64
APÊNDICE A – Código-fonte da tela principal .................................................................. 65
APÊNDICE B – Código-fonte da tela de detalhes da avaliação .......................................... 76
APÊNDICE C – Código-fonte da classe ArquivoManager.................................................. 77
APÊNDICE D – Código-fonte da classe EsqueletoUsuario ................................................ 78
APÊNDICE E – Código-fonte da classe KinectMath .......................................................... 80
APÊNDICE F – Código-fonte da classe ProcessamentoImagem ........................................ 81
14
1 INTRODUÇÃO
Está se tornando cada vez mais comum encontrar softwares voltados à área da saúde com o
objetivo de propiciar um maior desempenho e facilidade aos profissionais da área na execução
de suas tarefas. Desse modo, a saúde é uma das pioneiras na utilização de aplicações de visão
computacional por meio de tecnologias de análise e processamento de imagens (BALLARD;
BROWN, 1982). O Microsoft Kinect - pertencente ao console Xbox - é um dos acessórios que
vem ganhando destaque nos últimos anos, devido aos recursos que o dispositivo oferece tanto
para o desenvolvedor quanto para os usuários.
Diversos estudos, como por exemplo, os realizados por Souza et al (2015), Fiorini
(2014) e Alves, Araújo e Madeiro (2012) demonstram que a fisioterapia é uma das áreas que
vem se destacando nos últimos anos com a modernização das técnicas e avanço das pesquisas
na utilização do Microsoft Kinect em prol da saúde, uma vez que o acessório pode ser usado na
resolução de diversos problemas, como por exemplo, a reabilitação de pacientes com lesões
neurológicas e musculares, além de ser útil na obtenção de alguns dados antropométricos do
ser humano.
O Kinect oferece recursos que são capazes de fornecer certos dados antropométricos do
ser humano. Porém, em alguns casos, esses recursos são limitados quando se deseja obter
resultados com maior exatidão. Um exemplo disso é o mapeamento das articulações do corpo
humano, na qual, os pontos mapeados pelo dispositivo divergem em relação aos pontos que são
mapeados manualmente. Esse problema foi constatado por Chaves (2014) em seu estudo, onde
se concluiu que o uso apenas dos pontos (joints) nativos oferecidos pelo Kinect se tornava
inviável no cálculo do Índice de Percepção Corporal da Imagem Real, utilizando a técnica de
Procedimento de Marcação do Esquema Corporal ou Image Marking Procedure (IMP).
Nesse mapeamento das articulações através método tradicional, o ser humano
geralmente encontra-se na posição anatômica, a fim propiciar um estudo minucioso acerca das
estruturas presentes no corpo humano. Para isso, o corpo deve encontrar-se em um dos planos
de referências ou secção, de forma que ele seja “divido” em partes menores, com o objetivo de
auxiliar a visualização das estruturas presentes em cada parte. Um dos planos de secção é plano
sagital, que divide o corpo humano ao meio, de cima para baixo, originando assim duas metades
simétricas, uma direita e outra esquerda (VERDERI, 2003).
Uma tecnologia que auxilia com maior precisão a obtenção dos pontos mapeados é a
utilização um mecanismo computacional para delimitação de áreas sobre a imagem fornecida
pelo sensor de profundidade do Kinect, a fim de se obter apenas a representação do corpo
15
2 REFERENCIAL TEÓRICO
PARTE SUBDIVISÃO
Pescoço Pescoço
1
Disponível em: <http://goo.gl/oZzXpD>. Acesso em 05 de maio de 2015.
19
2
Disponível em: <http://goo.gl/jbMgno>. Acesso em 05 de maio de 2015.
20
3
Disponível em: <http://goo.gl/GYKCN0>. Acesso em 06 de maio de 2015.
22
Paciornik (2001) elaborou uma sequência padrão de estudo, a fim de estruturar os passos
do Processamento e Análise de Imagens Digitais (PADI) de forma que os procedimentos
fossem separados em etapas. A Figura 6 apresenta o fluxograma com a sequência padrão de
PADI.
2.2.2 Segmentação
O processo de segmentação, de um modo geral, é o primeiro passo ao analisar uma imagem
(QUEIROZ; GOMES, 2001). Esse processo consiste na identificação de regiões de objetos
relevantes em uma imagem, sendo uma das etapas mais complexas de se programar
(MARQUES FILHO; VIERA NETO, 1999). De acordo com Queiroz e Gomes (2001, p. 25),
os algoritmos de segmentação consistem na distinção de um ou mais objetos “tanto entre si
quanto entre si e o background”. O sistema visual do ser humano tem a capacidade de executar
essa função naturalmente, já não encontra dificuldades em localizar objetos ao observar uma
determinada imagem (CONTI, 2010).
Segunda Vega (2011) “não existe um modelo padrão para a segmentação, o processo é
essencialmente empírico e deverá se ajustar a diferentes tipos de imagem”. O resultado obtido
na extração de um objeto em uma imagem é inerente ao grau de processamento aplicado aos
dados da imagem (SALDANHA; FREITAS, 2009). Existem duas peculiaridades em comum
aos objetos que compõe uma imagem: a semelhança interna conforme a propriedade da imagem
e o contraste em relação a sua vizinhança (SALDANHA; FREITAS, 2009).
Conforme Silva (2012) “uma imagem geralmente pode ser segmentada de acordo com
duas propriedades dos seus níveis de cinza: descontinuidades ou similaridades, gerando,
respectivamente, dois tipos básicos de segmentos: fronteiras ou regiões”.
2.2.2.1 Descontinuidade
De acordo com Silva (2012), existem três formas de identificar uma descontinuidade em uma
imagem. São elas:
27
● um ponto isolado - é o modo mais simples, que ocorre se um pixel conter um nível cinza
com valor diferente de sua vizinhança (SILVA, 2012);
● linhas - realiza-se a verificação para descobrir se os pixels equivalentes estão em linha.
O uso de mascaras pode auxiliar na descoberta (SILVA, 2012);
● borda de objeto - esse processo visa encontrar e ressaltar os pixels bordas, onde
aumenta-se a diferença entre o background e a borda da imagem (SILVA, 2012);
Figura 10. Etapas da Transformada de Hough para descoberta de uma forma geométrica
Fonte: Adaptado de MACEDO, 2005, p. 4
De acordo com Silva (2012, p. 38)
o conceito principal da transformada está em definir um mapeamento entre o espaço
de imagem e o espaço de parâmetros. Cada borda de uma imagem é transformada pelo
mapeamento para determinar células no espaço de parâmetros, indicadas pelas
primitivas definidas através do ponto analisado. Essas células são incrementadas e
indicarão, no final do processo, através da máxima local do acumulador, quais os
parâmetros correspondem à forma especificada.
2.2.2.3 Limiarização
A limiarização ou threshold é uma das técnicas mais simples na descoberta de objetos ou parte
de objetos presentes em uma imagem (FERRAREZI, 2010). De acordo com Marques Filho e
Vieira Neto (1999) a limiarização também é conhecida como binarização, já que uma imagem
binária é obtida ao final do processamento. Essa técnica consiste na divisão em duas partes do
histograma de uma imagem, onde os pixels com tom de cinza maior ou igual a um valor de um
limiar (T) são convertidos em branco e o restante em preto (FERRO NETO, 2012).
No princípio matemático a limiarização consiste em um método de PDI na qual, uma
imagem de entrada f(x, y) de N níveis de cinza resulta em uma imagem g(x, y) com níveis de
28
cinza menores que N. Desse modo, a imagem resultante apresenta dois níveis de cinza, sendo 0
para preto se N for maior ou igual a limiar (T) e 1 para branco se N for menor que a limiar (T)
(MARQUES FILHO; VIEIRA NETO, 1999).
4
Disponível em: <http://goo.gl/WaAKTD>. Acesso em 11 de junho de 2015.
30
3 METODOLOGIA
3.3 Hardware
Em termos de hardwares foram utilizados um computador de uso pessoal, um Kinect
acompanhando de um adaptador - responsável pela conexão entre Kinect e o computador -
disponibilizado pelo Grupo de Estudos e Pesquisa em Tecnologia, Saúde e Qualidade de Vida
(GEPETS) do CEULP.
31
Após a implementação das duas etapas anteriores, a terceira etapa teve como objetivo o
desenvolvimento de uma técnica para verificação da eficiência da delimitação de áreas no corpo
humano. Para esse propósito, foi desenvolvido um módulo para calcular alguns dos atributos
antropométricos do ser humano, tais como: a estatura, a largura do ombro e a largura do quadril.
Na obtenção do valor da mensuração do atributo antropométrico, primeiro utilizou-se como
base a medida fornecida pelos joints através do cálculo de distância entre dois pontos - já que
joints permitem a realização de tal recurso devido aos valores em metros das propriedades X,
Y e Z. Com isso, a partir da referência para identificação dos atributos antropométricos e da
representação do corpo humano desenvolvido na segunda etapa calculou-se a provável medida
utilizando o cálculo da proporção.
Por fim, a quarta etapa teve como propósito a integração do software desenvolvido na
plataforma FisioKinect. Nessa etapa foi modelado o banco de dados para que a aplicação
pudesse salvar todas as informações das avaliações.
4 RESULTADOS E DISCUSSÕES
A presente seção expõe os desfechos obtidos no decorrer do desenvolvimento do presente
trabalho. A princípio será apresentada uma visão geral da ferramenta desenvolvida, bem como
a arquitetura e funcionamento da mesma. Posteriormente, será apresentado um protocolo para
a utilização da aplicação, abrangendo o passo a passo para sua utilização. Por último, será
detalhado o processo de codificação da aplicação acerca das principais funcionalidades.
4.1 O software
Para comprovar a eficiência da técnica computacional de delimitação de áreas, foi necessário o
desenvolvimento de algumas funcionalidades que fossem capazes de mensurar certos atributos
antropométricos do ser humano. Dessa forma, optou-se por mensurar três atributos: a altura, a
largura dos ombros e a largura da cintura. Esses atributos satisfazem a avaliação da técnica
computacional, uma vez que os mesmos têm como características a delimitação do corpo para
ter um resultado preciso. A figura abaixo exibe a tela software desenvolvido no presente
trabalho.
a coleta. Para coletar uma informação, basta selecionar o atributo desejado e clicar no botão
Capturar.
No Box Opções de visualização o usuário define se deseja visualizar as imagens
fornecidas pela câmera RGB ou pelo sensor de profundidade. Nessa segunda opção, é realizado
um tratamento na imagem fornecida pelo sensor de profundidade, de modo que a mesma
consiga exibir uma representação do corpo humano com o máximo de detalhes possível, já que
essa imagem é responsável pelo cálculo dos dados antropométricos.
É importante ressaltar que a opção Sensor profundidade deve estar selecionada para que
o cálculo seja realizado, mesmo com as duas imagens - RGB e profundidade - estarem
executando em paralelo. Isso se dá devido ao atributo visibly presente em cada canvas
que reproduz as imagens e pelo fato do cálculo ser realizado sob a imagem do sensor de
profundidade. Dessa forma, faz-se necessário que seja exibida a imagem do sensor de
profundidade.
Para que o corpo seja exibido da melhor forma possível, é aplicada a técnica de
limiarização na imagem emitida pelo sensor RGB em tempo real. Para isso, na exibição do
corpo humano, optou-se por deixar a silhueta do mesmo com a cor preta e o background com a
cor branca. Abaixo, a Figura 17 apresenta o software com a opção Sensor profundidade ativada.
cálculo de distância entre dois pontos, bem como, a quantidade de pixels presentes no segmento,
já que ele utiliza como base os joints shoulder right e shoulder left. No segmento Mb também
é possível notar que os joints não chegam à extremidade do corpo, de forma, que o valor da
distância desse segmento não é um valor válido nesse contexto de obter a mensuração real dos
ombros.
Sendo assim, para obter o valor do comprimento do segmento Mp calcula-se a
quantidade total de pixels pretos - que representa o corpo humano, conforme explicado na
subseção anterior - a partir das coordenadas de Mb referentes à linha de onde se encontra o
segmento. Por fim, com a quantidade de pixels do segmento Mp e a quantidade de pixels
juntamente com distância - em metros - do segmento Mb, realiza-se o cálculo de proporção para
obter a provável distância de Mp.
𝑑𝑖𝑠𝑡â𝑛𝑐𝑖𝑎 𝑑𝑒 𝑀𝑏 × 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑖𝑥𝑒𝑙𝑠 𝑑𝑒 𝑀𝑝
(2)
𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑖𝑥𝑒𝑙𝑠 𝑑𝑒 𝑀𝑏
4.2.1 Joints utilizados pelo segmento Mb
Como apresentado na subseção acima, a distância do segmento Mb é obtida por meio do cálculo
da distância entre dois joints referentes ao atributo antropométrico desejado. O Quadro 3 exibe
os joints referentes a cada atributo antropométrico calculado pelo software desenvolvido no
presente trabalho.
recebe os dados da imagem resultante do sensor de profundidade do Kinect. Com isso, o trecho
de código entre as linhas 58 e 69 realiza o tratamento para aplicação da limiarização. Vale
destacar que as variáveis utilizadas nesse processo foram instanciadas anteriormente, como
mostrou a Figura 23. O Quadro 4, a seguir, apresenta comentários a respeito desse trecho de
código.
Quadro 4. Comentários sobre a configuração da limiarização
LINHA(S) COMENTÁRIO
Cria uma espécie de retângulo a partir da imagem resultante do trecho de código das
60 e 61
duas linhas anteriores
Gera uma nova imagem, sendo esse um processo parecido com o apresentado nas
65 e 66
linhas 58 e 59. A única diferença é o formato de pixels, agora, no padrão RGB
Cria uma espécie de retângulo através da imagem resultante no trecho de código das
67 a 68
linhas 65 e 66. Variáveis desse tipo são utilizadas para escrever dados em um Bitmap
Nas linhas 71 e 72, as variáveis dos canvas dois e três recebem a imagem com a
representação da silhueta do corpo humano gerada pelo trecho de código das linhas 65 e 66.
Quase todas as variáveis presentes no trecho de código entre as linhas 58 e 69 são utilizadas no
evento DepthFrameRead - Figura 25 - habilitado na linha 74.
Figura 27. Método para captura dos atributos cujos segmentos são horizontais
Primeiramente, declarou-se a variável distancia que recebe ao final do processo o
valor da mensuração do atributo selecionado. Como explicado na subseção 4.3, o software salva
as imagens exibidas pelos canvas dois e três. Para isso, na linha 389, a variável recebe um
nome criptografado a partir da data e hora em que o processo de captura foi iniciado. Dessa
forma, não existe problema em sobrescrever uma imagem já existente na pasta temporária do
sistema operacional.
O método GerarBitmap da classe ProcessamentoImagem é responsável por
capturar e salvar a imagem do canvas dois. Dessa forma, ele recebe como parâmetros o objeto
do canvas dois, uma instância da tela em execução e o nome da imagem a ser salva na pasta
temporária. Com isso, após concluir a execução, o método retorna a localização completa de
onde a imagem ficou salva no sistema operacional. Com a primeira imagem salva, a próxima
etapa consiste em localizar o segmento Mb. Para isso, na linha 392 executa-se o método
responsável pela localização, passando como parâmetro a URL (Uniform Resource Locator) da
imagem salva. A Figura 28 apresenta o código do método em questão.
47
Figura 30. Métodos para cálculo da distância entre dois pontos e cálculo da proporção
É importante lembrar que os valores de cada ponto - no método da distância entre dois
pontos - são obtidos pelas propriedades X e Y dos dois joints correspondentes ao atributo
calculado. Além disso, vale ressaltar que essa distância é calculada no instante em que o usuário
seleciona o atributo antropométrico desejado.
Após a localização dos segmentos e cálculo da provável mensuração dos atributos
antropométricos, é chamado o método PreencherDetalhes() que consiste em atribuir os
valores para a variável da linha 22 apresentado na Figura 23, cujas informações são exibidas na
tela de detalhes apresentada na subseção 4.4. Com isso, removem-se as imagens que foram
salvas na pasta temporária do sistema operacional, além de alternar a exibição novamente para
o canvas dois. Concluído todo o processo, é retornado o valor do possível atributo
antropométrico.
tonalidade vermelha - é inferior a mesma quantidade de pixels das demais linhas. Assim, houve
a necessidade de implementar um método para obter o maior segmento através das coordenadas
encontradas pelo método de localização de Mb. A Figura 32 expõe esse método.
Figura 33. Método para captura dos atributos cujos segmentos são verticais
O código acima é semelhante com o código apresentado na Figura 27. Difere-se apenas
em alguns métodos e variáveis, o que não altera a lógica apresentada na subseção 4.2. Nas
linhas 430 e 431 as variáveis recebem os valores referentes a linha e a coluna da primeira
coordenada localizada no segmento Mb. Em seguida, chama-se o método localização do
segmento Mp - cuja orientação nesse atributo antropométrico é vertical - passando como
parâmetro as duas variáveis - linha e coluna - e a URL da imagem salva - referentes ao
canvas três. A Figura 34 mostra o código desse método.
outras palavras: quanto mais próximo do Kinect a pessoa estiver, maior será sua silhueta, bem
como, quanto mais longe a pessoa estiver, menor será sua silhueta. Esse problema ocorre devido
ao modo como o cálculo é realizado, já que é levado em consideração a quantidade de pixels
dos segmentos Mb e Mp na obtenção do resultado final.
Também se observou outro fator que pode gerar imprecisão no resultado. Trata-se do
tipo de roupa usada e o tipo de corte do cabelo, pois o algoritmo de limiarização não faz
distinção de roupas, cabelo e couro cabeludo em relação a silhueta do corpo humano. O
algoritmo de limiarização consiste em tentar representar da melhor forma possível a silhueta
corporal, dessa forma, se a pessoa estiver com uma roupa folgada, o resultado da largura da
cintura e/ou largura do quadril será impreciso, já esse detalhe pode aumentar a quantidade de
pixels do segmento Mp. O mesmo problema ocorre com o cálculo da estatura, sendo que esse
tem como fator de imprecisão o tipo de penteado da pessoa. Por exemplo, uma pessoa cujo
penteado for um topete terá imprecisão no resultado se comparado a uma pessoa que não possui
tal penteado, já que o topete também aumentará a quantidade de pixels de Mp.
Assim sendo, elaborou-se um protocolo para minimizar qualquer fator que viesse a
intervir na coleta dos dados e no resultado, desde a inicialização do software até a posição em
que o avaliado deve se encontrar no momento da avaliação.
igual a 0,675. Sobre isto, a autora argumenta que, talvez, este resultado esteja associado tanto
ao tamanho da área avaliada, como a qualidade da câmera da primeira versão do Kinect.
Quanto ao tamanho/comprimento da área avaliada, a autora argumenta que em áreas
maiores, como a estatura, as diferenças em pixels sejam pouco relevantes enquanto que, em
áreas menores, as diferenças tenham impacto muito mais significativo.
Além disto, a imprecisão da silhueta gerada pela primeira versão do Kinect possa
também influenciar tal resultado, todavia, ela ainda propõe o método seja adaptado para a
versão 2.0 do Kinect em trabalhos futuros, dada a possibilidade de que esta nova versão gere
uma silhueta mais precisa pela qualidade de sua câmera.
57
5 CONSIDERAÇÕES FINAIS
O presente trabalho teve como objetivo o desenvolvimento de um software para delimitação da
silhueta corporal utilizando o Kinect e recursos de computação gráfica. O estudo dos oferecidos
pelo Kinect juntamente com as técnicas da computação gráfica foram fundamentais para que
se chegasse aos resultados apresentados. Para verificar a viabilidade do uso de recursos do
Kinect aliados às técnicas de computação gráfica, optou-se pela implementação de módulos
para realizar mensuração de alguns atributos antropométricos, já que, o conceito do cálculo
desses atributos envolve a representação do corpo humano.
A técnica de limiarização aplicada à imagem obtida pela câmera de profundidade do
Kinect ajuda a obter uma representação do corpo humano quase que ideal. O único fator que
deixou a desejar foi a imprecisão encontrada na borda da silhueta do corpo humano, pois a
mesma nem sempre é obtido de forma precisa. Tal fator não torna a técnica de delimitação de
áreas inviável, posto que é quase impossível obter uma representação perfeita com a qualidade
que a câmera de profundidade fornece a imagem para aplicação da técnica.
Uma das etapas mais complexas de ser realizada nesse trabalho foi a elaboração da
lógica para realização do cálculo, pois, a princípio, decidiu-se que não se utilizaria nenhum
outro recurso computacional para identificar a região referente aos atributos antropométricos
na imagem após a aplicação da técnica de limiarização. Assim sendo, surgiu a ideia dos
segmentos Mb e Mp a partir de estudos realizados em outros trabalhos, de forma que essa ideia
se tornou indispensável para realização do cálculo de cada atributo antropométrico.
Após concluir a fase de implementação do software, os testes realizados foram
essenciais para a elaboração do protocolo de avaliação, pois, sem a realização dos mesmos não
existiria uma melhor compreensão de quais fatores afetavam o resultado final do cálculo, já que
o algoritmo de limiarização não faz distinção dos elementos de imprecisão mencionados no
trabalho.
Trabalhos futuros que darão continuidade a este poderão aplicar outros recursos
computacionais gráficos a fim de melhorar ainda mais a silhueta, de forma que se tenha uma
representação com o mínimo de imprecisão possível. Também, podem ser implementados
módulos para mensurar novos atributos antropométricos. Do mesmo modo, novos trabalhos
podem ser desenvolvidos utilizando o Kinect v2, visto que essa versão do dispositivo é superior
a versão utilizada no presente trabalho, além de fornecer novos recursos que podem melhorar
ainda mais a precisão do cálculo realizado pelo software.
58
Dessa forma, conclui-se que com o uso dos recursos do Kinect junto com recursos de
computação gráfica, é possível que se obtenha uma representação da silhueta do corpo humano
e que se tenha uma provável medida de determinados atributos antropométricos.
59
REFERÊNCIAS
ALVES, Rodrigo de Sales; ARAUJO, Jefferson Oliveira Alves de; MADEIRO, Francisco.
AlfabetoKinect: Um aplicativo para auxiliar na alfabetização de crianças com o uso do
Kinect. In: Anais do Simpósio Brasileiro de Informática na Educação. 2012.
BALLARD, Dana H.; BROWN Christopher M. Computer Vision. New Jersey: Prentice-
Hall, Inc., 1982.
BOUCHARD, Samuel. Using the Kinect for robotic manipulation. 2011. Disponível em:
<http://blog.robotiq.com/bid/40428/Using-The-Kinect-For-Robotic-Manipulation>. Acesso
em: 10 jun. 2015.
COSTA, Valéria Catelli Infantozzi. Anatomia geral humana. 2008. Disponível em:
<http://neurociencia.tripod.com/labs/lela/textos/APOSTILA_ANATOMIA_HUMANA.pdf>.
Acesso em: 10 mar. 2015.
CUNHA, Gladis Franck da. Aspectos gerais e históricos da anatomia humana. 2011.
DÂNGELO, José Geraldo; FATTINI, Carlo Américo. Anatomia Humana Básica. São
Paulo: Atheneu, 2002. 184 p.
60
DIAS, Felipe da Cruz. Uso do software Image J para análise quantitativa de imagens de
microestruturas de materiais. 2008. 148 f. Dissertação (Mestrado) - Curso de Engenharia e
Tecnologia Espaciais/Ciência e Tecnologia de Materiais e Sensores, Instituto Nacional de
Pesquisas Espaciais, São José dos Campos, 2008. Disponível em:
<http://www.teliga.net/2011/02/aspectos-gerais-e-historicos-da.html>. Acesso em: 02 mar.
2015.
DRAKE, Richard et al. Gray's - Anatomia para Estudantes. S.l: Elsevier, 2010. 1136 p.
DUDA, Richard O.; HART, Peter E. Use of the Hough transformation to detect lines and
curves in pictures. Communications of the ACM., vol. 15, pp. 11-15, 1972.
FIORIN, Magliani Reis et al. Motion Rehab: um jogo sério para idosos com sequelas de
Acidente Vascular Encefálico. 2014. Disponível em:
<http://www.lbd.dcc.ufmg.br/colecoes/wim/2014/009.pdf>. Acesso em: 14 de maio 2015.
GRAAFF, van de. Anatomia Humana. 6. ed. [S.l]: Manole, 2003. 900 p.
LÓPEZ, José Juan Hernández et al. Detecting objects using color and depth segmentation
with Kinect sensor. Procedia Technology, [s.l.], v. 3, p.196-204, 2012. Elsevier BV. DOI:
10.1016/j.protcy.2012.03.021. Disponível em:
<http://api.elsevier.com/content/article/PII:S2212017312002502?httpAccept=text/xml>.
Acesso em: 13 jun. 2015.
MARQUES FILHO, Ogê; VIEIRA NETO, Hugo. Processamento Digital de Imagens. Rio
de Janeiro: Brasport, 1999.
PANGER, Galen. Kinect in the Kitchen: Testing Depth Camera Interactions in Practical
Home Environments. Berkeley: University Of California, 2012.
PAULA, Bruno Campagnolo de. Adaptando e desenvolvendo jogos para uso com o
Microsoft Kinect. Paraná: Sbgames, 2011. 13 p. Disponível em:
<http://www.sbgames.org/sbgames2011/proceedings/sbgames/papers/tut/1-kinect_FAAST
_Final_MesmoComColunas.pdf>. Acesso em: 12 jun. 2015.
PIAZZA, Bruno Luis. O ensino de anatomia humana nos cursos de Educação Física da
região metropolitana de Porto Alegre. Ciência em Movimento, Porto Alegre, v. 26, n. 13,
p.99-109, fev. 2011.
TORTORA, Gerard J.. Corpo Humano - Fundamentos de Anatomia e Fisiologia. 4. ed. [s.
L.]: Artmed, 2001. 630 p.
VEGA, Maria Luiza Monteiro Dela. Métodos e análise para seg-mentação de imagens
ultrasso-nográficas da mama. 2011. 83 f. TCC (Graduação) - Curso de Curso de Engenharia
Elétrica Com ênfase em E-letrônica, Departamento de Engenharia Elétrica, Universidade de
São Paulo, São Carlos, 2011. Disponível em:
<http://www.tcc.sc.usp.br/tce/disponiveis/18/180450/tce-02042012-084929/?&lang=br>.
Acesso em: 22 maio 2015.
XBOX, Support. Mais sobre posicionamento do sensor Kinect. 2015. Microsoft. Disponível
em: <http://support.xbox.com/pt-BR/xbox-360/kinect/sensor-placement>. Acesso em: 22 out.
2015.
64
APÊNDICES
65
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using KinectDepth.Controller;
using KinectDepth.Models;
using Microsoft.Kinect;
namespace KinectDepth
{
public partial class MainWindowDepth : Window
{
private bool _imagemRgbHabilitado;
private bool _imagemSensorProfundidadeHabilitado;
private double _distancia;
private double _alturaPeloKinect;
private readonly DetalhesCaptura _detalhes;
private KinectSensor _sensorKinect;
private WriteableBitmap _imagemProfundidadeBruta;
private Int32Rect _imagemProfundidadeBrutaRect;
private short[] _dadosPixelProfundidadeBruta;
private int _imagemProfundidadePassadaBruta;
private WriteableBitmap _imagemProfundidadeTratada;
private Int32Rect _imagemProfundidadeTratadaRect;
private int _imagemProfundidadePassadaTratada;
private Paciente _paciente;
if (_sensorKinect != null)
{
if (_sensorKinect.Status == KinectStatus.Connected)
{
_sensorKinect.SkeletonStream.Enable();
_sensorKinect.DepthStream.Enable();
_imagemProfundidadeTratada = new
WriteableBitmap(fluxoProfundidade.FrameWidth,
fluxoProfundidade.FrameHeight, 96, 96,
PixelFormats.Bgr32, null);
_imagemProfundidadeTratadaRect = new Int32Rect(0, 0,
(int)Math.Ceiling(_imagemProfundidadeTratada.Width),
(int)Math.Ceiling(_imagemProfundidadeTratada.Height));
_imagemProfundidadePassadaTratada =
fluxoProfundidade.FrameWidth * 4;
ImagemSensorProfundidadeComSegmento.Background = new
ImageBrush(_imagemProfundidadeTratada);
ImagemSensorProfundidadeSemSegmento.Background = new
ImageBrush(_imagemProfundidadeTratada);
_sensorKinect.DepthFrameReady +=
SensorKinectDepthFrameReady;
_sensorKinect.ColorStream.Enable();
_sensorKinect.AllFramesReady +=
SensorKinectSensorOnAllFramesReady;
_sensorKinect.Start();
}
}
}
}
}
{
try
{
var imagem = CameraImagemRgb(e.OpenColorImageFrame());
if (imagem != null)
{
ImagemCameraRgb.Background = new ImageBrush(BitmapSource.Create(
_sensorKinect.ColorStream.FrameWidth,
_sensorKinect.ColorStream.FrameHeight,
96, 96, PixelFormats.Bgr32, null, imagem,
_sensorKinect.ColorStream.FrameWidth *
_sensorKinect.ColorStream.FrameBytesPerPixel));
}
ImagemCameraRgb.Children.Clear();
ImagemSensorProfundidadeComSegmento.Children.Clear();
ImagemSensorProfundidadeSemSegmento.Children.Clear();
if (CameraRgbRadioButton.IsChecked == true)
{
HabilitaImagemCameraRgb();
}
if (SensorProfundidadeRadioButton.IsChecked == true)
{
HabilitaImagemSensorProfundidade();
}
FuncoesParaCaptura(e.OpenSkeletonFrame());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, @"Kinect Depth", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
funcoesEsqueleto.DesenharArticulacao(ombroDireito,
ImagemSensorProfundidadeComSegmento, Brushes.Red);
funcoesEsqueleto.DesenharArticulacao(ombroEsquerdo, ImagemCameraRgb,
Brushes.Red);
funcoesEsqueleto.DesenharArticulacao(ombroDireito, ImagemCameraRgb,
Brushes.Red);
funcoesEsqueleto.DesenharOsso(ombroDireito, ombroEsquerdo,
ImagemSensorProfundidadeComSegmento);
funcoesEsqueleto.DesenharOsso(ombroDireito, ombroEsquerdo,
ImagemCameraRgb);
_distancia =
KinectMath.DistanciaEntreDoisPontos(ombroEsquerdo.Position.X,
ombroEsquerdo.Position.Y,
ombroDireito.Position.X, ombroDireito.Position.Y);
}
catch (Exception ex)
{
throw new Exception("Não foi possível desenhar o segmento de Mb para a
largura do ombro!", ex);
}
}
funcoesEsqueleto.DesenharArticulacao(quadrilDireito,
ImagemSensorProfundidadeComSegmento, Brushes.Red);
funcoesEsqueleto.DesenharArticulacao(quadrilEsquerdo,
ImagemSensorProfundidadeComSegmento, Brushes.Red);
funcoesEsqueleto.DesenharOsso(quadrilEsquerdo, quadrilDireito,
ImagemSensorProfundidadeComSegmento);
funcoesEsqueleto.DesenharArticulacao(quadrilDireito, ImagemCameraRgb,
Brushes.Red);
funcoesEsqueleto.DesenharArticulacao(quadrilEsquerdo, ImagemCameraRgb,
Brushes.Red);
funcoesEsqueleto.DesenharOsso(quadrilEsquerdo, quadrilDireito,
ImagemCameraRgb);
_distancia =
KinectMath.DistanciaEntreDoisPontos(quadrilEsquerdo.Position.X,
quadrilEsquerdo.Position.Y,
quadrilDireito.Position.X, quadrilDireito.Position.Y);
}
catch (Exception ex)
{
throw new Exception("Não foi possível desenhar o segmento de Mb para a
largura da cintura!", ex);
}
}
_imagemProfundidadeBruta.WritePixels(_imagemProfundidadeBrutaRect,
71
ImagemSensorProfundidadeSemSegmento.Visibility = Visibility.Visible;
Thread.Sleep(1000);
var nomeImagemSegmentoMp =
ArquivosManager.Criptografar(DateTime.Now.ToString(CultureInfo.InvariantCulture));
var urlImagemSegmentoMp =
ProcessamentoImagem.GerarBitmap(ImagemSensorProfundidadeSemSegmento, this,
nomeImagemSegmentoMp);
var linha = coordenadasMb.First().Key;
var coluna = coordenadasMb.First().Value[0];
var coordenadasMp =
ProcessamentoImagem.LocalizarSegmentoVerticalMp(urlImagemSegmentoMp, coluna, linha);
distancia = KinectMath.Proporcao(tamanhoMb, coordenadasMp.Count,
_distancia);
PreencherDetalhes(tamanhoMb, coordenadasMp.Count, _distancia, new[] {
coordenadasMb.First().Key,
coordenadasMb.First().Value[0] }, new[] {
coordenadasMb.Last().Key, coordenadasMb.Last().Value[0] },
new[] { coordenadasMp.First()[1], coordenadasMp.First()[0] },
new[] { coordenadasMp.First()[1], coordenadasMp.First()[0] });
ArquivosManager.Excluir(urlImagemSegmentoMp);
}
ArquivosManager.Excluir(urlImagemSegmentoMb);
ImagemSensorProfundidadeComSegmento.Visibility = Visibility.Visible;
ImagemSensorProfundidadeSemSegmento.Visibility = Visibility.Hidden;
return distancia;
}
BtnDetalhesCaptura.IsEnabled = true;
}
else if (SelecionaLarguraOmbros.IsChecked == true)
{
ResultadoLarguraOmbros.Text =
CapturaSegmentosHorizontais().ToString(CultureInfo.InvariantCulture);
BtnDetalhesCaptura.IsEnabled = true;
}
else
{
var alturaTotal = Math.Round(CapturaSegmentosVerticais() +
_alturaPeloKinect, 4);
ResultadoEstaturaPaciente.Text =
alturaTotal.ToString(CultureInfo.InvariantCulture);
BtnDetalhesCaptura.IsEnabled = true;
}
}
else
{
MessageBox.Show(@"Selecione a opção 'Sensor de profundidade'
para continuar!", @"Kinect Depth",
MessageBoxButton.OK, MessageBoxImage.Information);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, @"Kinect Depth", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
{
ManagerAntropometriaSilhueta.Cadastrar(new Antropometria_Silhueta
{
IdPaciente = _paciente.Id,
Estatura = double.Parse(ResultadoEstaturaPaciente.Text),
LarguraQuadril = double.Parse(ResultadoLarguraQuadril.Text),
LarguraOmbros = double.Parse(ResultadoLarguraOmbros.Text)
});
MessageBox.Show("Avaliação antropométrica salva com sucesso!",
@"Kinect Depth", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, @"Kinect Depth", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
}
}
76
using System;
using System.Windows;
using KinectDepth.Controller;
using KinectDepth.Models;
namespace KinectDepth
{
public partial class WindowDetalhesCaptura : Window
{
public WindowDetalhesCaptura(DetalhesCaptura detalhes)
{
InitializeComponent();
CarregarDetalhes(detalhes);
}
TotalPixelsMp.Content = detalhes.QuantidadePixelsMp;
TamanhoSegmentoMp.Content =
KinectMath.Proporcao(detalhes.QuantidadePixelsMb, detalhes.QuantidadePixelsMp,
detalhes.TamanhoMb) + "m";
CoordenadaInicialMp.Content = "[" + detalhes.CoordenadaInicialMp[0] +
"," + detalhes.CoordenadaInicialMp[1] + "]";
CoordenadaFinalMp.Content = "[" + detalhes.CoordenadaFinalMp[0] + ","
+ detalhes.CoordenadaFinalMp[1] + "]";
if (detalhes.AlturaKinect > 0)
{
TextoAlturaKinect.Visibility = Visibility.Visible;
AlturaKinect.Visibility = Visibility.Visible;
AlturaKinect.Content = detalhes.AlturaKinect;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, @"Kinect Depth", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
}
}
77
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace KinectDepth.Controller
{
public class ArquivosManager
{
public static string Criptografar(string texto)
{
try
{
var md5 = MD5.Create();
var inputBytes = Encoding.ASCII.GetBytes(texto);
var hash = md5.ComputeHash(inputBytes);
var sb = new StringBuilder();
foreach (var t in hash)
{
sb.Append(t.ToString("X2"));
}
return sb.ToString().ToLower();
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao tentar criptograr o texto!",
ex);
}
}
using Microsoft.Kinect;
using System;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace KinectDepth.Controller
{
public class EsqueletoUsuario
{
static private KinectSensor _kinect;
return posicaoArticulacao;
}
Canvas.SetTop(objetoArticulacao, deslocamentoVertical);
Panel.SetZIndex(objetoArticulacao, 100);
canvas.Children.Add(objetoArticulacao);
}
}
using System;
namespace KinectDepth.Controller
{
public class KinectMath
{
public static double DistanciaEntrePontos3D(double ax, double ay, double az,
double bx, double by, double bz)
{
return (Math.Sqrt(Math.Pow((bx - ax), 2) + Math.Pow((by - ay), 2) +
Math.Pow((bz - az), 2)));
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace KinectDepth.Controller
{
public class ProcessamentoImagem
{
public static Dictionary<int, List<int>> LocalizarSegmentoMb(string url)
{
try
{
var coordenadasSegmento = new Dictionary<int, List<int>>();
var valoresY = new List<int>();
var imagem = new Bitmap(url);
for (var x = 0; x < imagem.Height; x++)
{
for (var y = 0; y < imagem.Width; y++)
{
if (imagem.GetPixel(y, x).R > 0 && imagem.GetPixel(y, x).G ==
0 && imagem.GetPixel(y, x).B == 0)
{
valoresY.Add(y);
}
}
if (valoresY.Count > 0)
{
coordenadasSegmento.Add(x, new List<int>(valoresY));
valoresY.Clear();
}
}
return coordenadasSegmento;
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao tentar localizar o SEGMENTO Mb
na imagem!", ex);
}
}
{
valorInicialX.Value, y
});
}
}
return coordenadasSegmento;
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao tentar localizar o SEGMENTO
HORIZONTAL Mp na imagem!", ex);
}
}
if (contador > 0)
{
break;
}
}
return contador;
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao tentar contar os píxels da
imagem!", ex);
}
}
{
try
{
canvas.Measure(new System.Windows.Size(window.Width, window.Height));
var renderizar = new RenderTargetBitmap(597, 561, 96, 96,
System.Windows.Media.PixelFormats.Pbgra32);
renderizar.Render(canvas);
var urlImagem = ArquivosManager.PastaTemporaria(nomeArquivo);
var codificar = new PngBitmapEncoder();
codificar.Frames.Add(BitmapFrame.Create(renderizar));
using (var arquivo = File.Create(urlImagem))
{
codificar.Save(arquivo);
arquivo.Close();
}
return urlImagem;
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro salvar a imagem para realização
do cálculo!", ex);
}
}
}
}