Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Tracking de Objetos em Tempo Real: Uso da Biblioteca OpenCV em C++, Manuais, Projetos, Pesquisas de Programação em C++

Um projeto de engenharia biomédica que utiliza a biblioteca opencv em c++ para rastreamento de objetos em tempo real. O projeto é baseado na deteção de objetos em imagens e vídeos, com aplicação em diversas áreas da biomédica, como cirurgias assistidas por computador e análise de imagens médicas. O documento explica a utilização da biblioteca opencv, incluindo as bibliotecas opencv2/core/core.hpp, opencv2/highgui/highgui.hpp e opencv2/imgproc/imgproc.hpp, e as funções dilate, erode e houghcircles para rastreamento de objetos. O documento também fornece informações sobre a roda de cores hsv, a transformação de imagens entre os espaços de cor rgb e hsv, e a utilização de ascii code para escolher a cor e forma do objeto a ser detetado.

Tipologia: Manuais, Projetos, Pesquisas

2024

Compartilhado em 04/03/2024

ana-fonseca-86
ana-fonseca-86 🇵🇹

1 documento

1 / 22

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Escola Superior de Biotecnologia Universidade
Católica Portuguesa
Licenciatura em Bioengenharia Eng. Biomédica
UC - Programação Científica em Engenharia
Docente: Prof. Pedro Rodrigues
Ano letivo 2023/2024
Projeto da UC
Título:
Tracking de Objetos em tempo real
Elementos do grupo:
Ana Cláudia Fonseca
Inês Antunes
Isabella Oliveira
Sofia Ribeiro Pires
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16

Pré-visualização parcial do texto

Baixe Tracking de Objetos em Tempo Real: Uso da Biblioteca OpenCV em C++ e outras Manuais, Projetos, Pesquisas em PDF para Programação em C++, somente na Docsity!

Escola Superior de Biotecnologia – Universidade Católica Portuguesa Licenciatura em Bioengenharia – Eng. Biomédica UC - Programação Científica em Engenharia Docente: Prof. Pedro Rodrigues Ano letivo 2023/ Projeto da UC Título: Tracking de Objetos em tempo real Elementos do grupo: Ana Cláudia Fonseca Inês Antunes Isabella Oliveira Sofia Ribeiro Pires

Enquadramento:

C++ é uma linguagem de programação universal orientada a objetos, criada por Bjarne Stroustrup e a sua equipa em 1979. Com o passar do tempo, esta linguagem tornou-se a mais adequada para certos tipos de aplicações, como infraestruturas de softwares e outros programas que têm recursos limitados. (Fernando, n.d.) Dado que o C++ é capaz de manipular diretamente o hardware em que está a ser executado, os programadores têm a capacidade de otimizar o seu código para funcionar de maneira mais eficiente em qualquer ambiente de trabalho, mesmo quando este não possui muitos recursos de espaço ou energia para suportar a aplicação. (Xiao,

  1. Assim, essas aplicações executam-se de forma mais rápida e confiável em vários dispositivos, o que torna C++ a linguagem ideal para estabelecer a base de diversas aplicações importantes. C++ pode ser encontrada numa grande variedade de indústrias, como: sistemas operacionais, desenvolvimento de jogos, dispositivos IoT ( Internet of Things ), base de dados, entre outros. Mas no âmbito desta unidade curricular, focaremo-nos na indústria biomédica. Deste modo, esta linguagem de programação pode ser extremamente útil em várias aplicações médicas, uma vez que numerosos algoritmos avançados já foram desenvolvidos para esses propósitos. Alguns exemplos relevantes incluem máquinas de Ressonância Magnética (MRI), testes de equipamentos de laboratório, análise e organização de informação de pacientes, entre outros. Outras aplicações na engenharia biomédica incluem, por exemplo, o rastreamento de células anómalas na corrente sanguínea, um processo realizado através de rastreamento de objetos, para o qual é necessário utilizar ferramentas específicas, como a biblioteca OpenCV. (Rani et al., 2022) OpenCV é uma biblioteca virtual ‘ open-source ’ e, tal como o nome indica, trata-se de uma biblioteca de código aberto, acessível a qualquer pessoa, o que significa que pode ser modificada e o seu software redistribuído. Esta biblioteca, dedicada ao processamento de imagem e visão computacional, foi inicialmente desenvolvida pela Intel e posteriormente apoiada pela Willow Garage. Atualmente, é mantida pela Itseez e é aplicada tanto em contextos comerciais como não comerciais, porém esta biblioteca é maioritariamente indicada para processamento em tempo real. Hoje em dia, a OpenCV possui inúmeras funções que implementam algoritmos de processamento de imagem e visão computacional que, por sua vez, irão tornar o processamento de imagem muito mais fácil e eficiente. Passando agora para a definição de object tracking , esta é a técnica utilizada para prever a posição de um objeto-alvo, ao localizar a trajetória do objeto em questão quer esteja presente na imagem ou não. (Gad et al., 2022) Esta técnica cria uma identificação única para cada uma das deteções iniciais e, em seguida, rastreia cada um dos objectos à medida que se deslocam nos frames de um vídeo. Os algoritmos de object tracking em tempo real são utilizados para vigilância, por exemplo, na detecção da presença de animais num determinado local vigiado. (Walia, 2022) Durante a pandemia, os algoritmos de object tracking foram frequentemente utilizados para monitorizar multidões, com o intuito de verificar se as pessoas mantinham a distância social em zonas públicas. O object tracking está a ser cada vez mais adotado na indústria dos cuidados de saúde. (Acharya, 2023) As empresas farmacêuticas, por exemplo, recorrem a este tipo de localização para monitorizar a produção de medicamentos em tempo real e garantir que quaisquer emergências, como o mau funcionamento de máquinas ou linhas de produção de medicamentos defeituosas, são detetadas e tratadas em tempo real. Para uma compreensão mais profunda deste tópico, é crucial destacar algumas etapas:
  • Matiz/ Tonalidade ( Hue ): Matiz é a porção de cor do modelo, expressa como um número entre 0 a 360 graus.
  • Saturação: Saturação descreve a concentração de cinzento presente numa determinada cor, de 0 a 100%. Ao reduzir este componente, estamos a introduzir mais cinzento e isto irá produzir um efeito de desvanecimento ( faded ). Em algumas circunstâncias, a saturação aparece num parâmetro de 0 a 1, onde 0 é cinzento e 1 é a cor primária.
  • Valor (ou Luminosidade): Valor funciona em conjunção com a saturação e descreve a luminosidade ou intensidade da cor, de 0 a 100%, onde 0 é completamente negro e 100 o mais claro. O espaço de cor HSV é empregue para produzir gráficos computacionais de alta qualidade. De forma mais simples, ele é utilizado para escolher várias cores necessárias para uma imagem específica. Uma roda de cores HSV é usada para exibir cores conforme a perceção humana, permitindo que o utilizador selecione a cor desejada. A função cvtColor converte imagens entre os espaços de cor RGB e HSV. (W., 2019) Passamos de seguida para o modelo de cores RGB. Modelo de cores RGB: O modelo de cor RGB é um dos métodos de representação de cor mais utilizados em computação gráfica. Utiliza um sistema de coordenadas de cor com três cores primárias: R(vermelho), G(verde), B(azul) - modelo usado regra geral (RGB). B(azul), G(verde), R(vermelho) - modelo usado no código fornecido pelo professor (BGR). Cada cor primária pode assumir um valor de intensidade que varia de 0 (mais baixo) a 1 (mais alto). A mistura destas três cores primárias em diferentes níveis de intensidade produz uma variedade de cores. A coleção de todas as cores obtidas por uma combinação linear de vermelho, verde e azul forma o espaço de cor RGB em forma de cubo. O canto do cubo de cor RGB que se encontra na origem do sistema de coordenadas corresponde ao preto, enquanto o canto do cubo que se encontra na diagonal oposta à origem representa o branco. A linha diagonal que liga o preto e o branco corresponde a todas as cores cinzentas entre o preto e o branco, o que também é conhecido como eixo cinzento. No modelo de cor RGB, uma cor arbitrária dentro do espaço de cor cúbico pode ser especificada pelas suas coordenadas de cor: (r, g, b). Objetivo: O projeto apresentado foi desenvolvido no âmbito da Unidade Curricular de Programação Científica em Programação e tem como finalidade analisar o código apresentado e elaborar uma inovação do mesmo. Para a execução deste trabalho, utilizou-se o programa designado por Visual Studio 2022 Community Edition em C++ como ferramenta de auxílio. Assim sendo, pretende-se que os alunos de Bioengenharia estudem detalhadamente o código fornecido pelo professor, efetuando assim alguns ajustes no código, de modo a contribuir para a otimização do algoritmo e apresentar uma inovação na indústria biomédica.

Análise do código:

A análise do código fornecido pelo professor será realizada por partes ou linha a linha, na seção abaixo. As linhas um a quatro referem-se à inclusão de determinadas bibliotecas. É comum ver estas afirmações incluídas no começo de um programa OpenCV, o que irá garantir que as bibliotecas necessárias estejam disponíveis. Estas são conjuntos de arquivos de códigos usados para desenvolver software , que têm como objetivo facilitar a programação, fornecendo funcionalidades comuns, que já foram resolvidas anteriormente por outros programadores. Neste caso, são usadas as seguintes bibliotecas : opencv2/core/core.hpp - Garante que o programa escrito em C++ tem acesso a funcionalidades da biblioteca OpenCV que permite usar estruturas e funções do computador inclusive o acesso à câmara. inRange é um exemplo de uma das funções pertencentes a esta biblioteca. ( OpenCV: Opencv2/core.hpp File Reference , n.d.) opencv2/highgui/highgui.hpp - Permite que o programa escrito em C++ tem acesso à funcionalidade HighGUI da biblioteca OpenCV permitindo trabalhar com imagem e vídeo e ainda criar interfaces gráficas. Esta biblioteca oferece funções como WINDOW_AUTOSIZE e imshow. (OpenCV: Opencv2/highgui.hpp File Reference, n.d.) opencv2/imgproc/imgproc.hpp - Oferece ao programa escrito em C++ acesso a funcionalidades de processamento de imagem fornecido pelo modelo Imgproc da livraria OpenCV permitindo usar uma vasta gama de modificações em imagens e vídeos. A título de exemplo tem-se erode, GaussianBlur, COLOR_BGR2HSV e HoughCircles. ( OpenCV: Opencv2/imgproc.hpp File Reference , n.d.) Por fim, iostream é uma biblioteca orientada a objetos, que fornece funcionalidade de entrada e saída usando expressões como cout e cin. Seguimos para as linhas de código seguintes. Estas linhas são apenas adicionadas para tornar o código mais conciso, e adicionam-se antes da função main e depois da identificação das bibliotecas. Desta forma, este recurso simplifica o código, eliminando a necessidade de usar o prefixo std:: e cv:: antes de elementos pertencentes ao namespace padrão (como cout, cin) e de elementos OpenCV como os mencionados nas bibliotecas descritas previamente.

No que toca à parte seguinte do código, aqui são definidos os valores das variáveis inteiras de low_H, high_H, lowS, high_S, low_V e high_V , ou seja, são atribuídos determinados valores máximos e mínimos para os parâmetros H ( Hue ), S ( Saturation ) e V ( Value ). A combinação destes valores corresponde à gama de valores da cor amarela. A atribuição destes valores a estas 6 variáveis define a cor dos objetos que este código será capaz de identificar. Inicia-se, na linha 21, o ciclo while, que funcionará desde que a tecla Escape não seja pressionada (tecla cujo número correspondente é 27, como explicado acima) e a web cam esteja ligada e aberta. De seguida, é usada uma função booleana para aferir se a imagem original está a ser lida sem erros. Se o frame for lido com sucesso, esta variável booleana ( blnFrameReadSuccessfully ) será definida como verdadeira. Caso haja um problema com a leitura da imagem (por exemplo, o final do fluxo de vídeo for atingido ou houver um erro), ele será definido como falso. Ainda que a webcam esteja aberta e ligada, esta pode não ter acesso à informação que dela é transmitida. Assim, dentro do loop , se a variável anteriormente declarada e explicada (blnFrameReadSuccessfully ) retornar um valor falso e não seja possível obter as imagens da ( Orig_img.empty() ), será apresentada uma mensagem de erro e o loop terminará (dado a presença do break na linha 36). Passamos então para a explicação das funções apresentadas nas linhas 39 a 44. Começando por cvtColor , este é uma função capaz de converter uma imagem para outra mantendo a mesma informação. Orig_img é a imagem que servirá de input (em BGR) e a

Hist_img é a imagem transformada com o esquema de cores alterado para o formato HSV. É de notar que esta passagem do modelo BGR para HSV se deve ao facto de ser mais fácil representar uma cor no último modelo. (OpenCV: Changing Colorspaces, n.d.) (Choudhary, n.d.) A seguinte função. inRange , utiliza 3 vetores: o da fonte, limite superior e inferior e compara-os de forma a criar um vetor final o Img_t. Se os valores do vetor da fonte Hist_img estiverem dentro dos valores dos vetores limites superiores Scalar(high_H, high_S, high_V) e inferior (Scalar(low_H, lowS, low_V ) o número do vetor desta posição fica 255 (correspondente aos valor máximo do pixel). Caso os valores do vetor fonte estejam fora destes limites, no vetor final estes serão 0. Desta forma, esta função permite identificar os objetos cuja cor esteja dento dos parâmetros definidos. Depois segue-se a função GaussianBlur - esta desfoca a imagem e suaviza-a utilizando um filtro Gaussiano. A imagem inicial Img_t transformar-se-á na imagem final Img_t. O parâmetro size(3, 3), 0) controla o quão desfocado fica, ou seja, determina a quantidade de pixeis considerados na vizinhança de cada um. Os números referem-se à largura e altura da imagem e têm sempre de ser ímpares. dilate - Esta função dilata a imagem de base ao utilizar um elemento estrutural específico que determina o formato da vizinhança pixelada do qual o máximo é retirado; Esta função dilata a imagem inicial Img_t e transforma-a na imagem Img_t. O último parâmetro dentro desta função identifica os pixeis na vizinhança com recurso a uma matriz, que se não for especificada (como é o caso, sendo que o último parâmetro é 0), será uma matriz de 3 por 3 em volta de cada pixel e adiciona pixels no limite dos formatos da figura. erode - Esta função erode a imagem original utilizando um elemento estrutural específico que determina o formato da vizinhança pixelada do qual o máximo é retirado; Para esta transformação da imagem também se recorre a um elemento estrutural específico, mas que nesta situação vai erodir as bordas da imagem. O 0 apresentado como último parâmetro tem o mesmo significado que o 0 da função dilate explicada anteriormente. Estas duas últimas funções são aplicadas com vista a retirar ruído da imagem e fazer a separação nítida dos elementos/objetos. (OpenCV: Eroding and Dilating, n.d.) HoughCircles - Esta função encontra círculos numa imagem de escala de cinzento utilizando uma versão modificada da transformada de Hough. Img_t refere-se à imagem onde esta transformada referida será aplicada e o parâmetro seguinte às coordenadas e respetivo raio dos círculos detetados atrás. “HOUGH_GRADIENT” entende-se como o método de deteção dos círculos. O número 2 apresentado representa a razão entre a resolução acumulada e a resolução da imagem. Os valores apresentados a seguir são, por ordem, a distância mínima entre centros dos círculos detetados, limite para o valor de gradiente usado, limite de acumulador para a deteteção dos círculos e os últimos dois o raio mínimo e máximo dos círculos detetados. Desta forma, ao utilizar estas funções, torna-se mais fácil analisar as imagens, resultando num desempenho mais eficiente do programa em si.

Na linha 57 o return (0) é colocado no final da função int main para indicar que o programa foi executado com sucesso. A linha final do código traduz o fim da função main, fechando o programa concebido.

Inovação acrescentada:

Com o desenvolvimento desta inovação, pretendemos que o código não consiga apenas detetar objetos redondos amarelos, mas sim outras formas geométricas de outras cores. Deste modo, o código aprimorado dá ao utilizador o poder de escolha da cor e forma

do objeto que pretende detetar. Em adição, o programa desenvolvido assinala o objeto com a cor do mesmo. Existem 3 opções para cada parâmetro, sendo amarelo, azul e vermelho as cores disponíveis e círculos, triângulos e quadriláteros as formas geométricas que o código consegue detetar.

Referências Bibliográficas:

Acharya, A. (2023, October 17). The Complete Guide to Object Tracking [Tutorial]. Encord. https://encord.com/blog/object-tracking-guide/ Bear, J. H. (2019, November 11). The HSV Color Model in Graphic Design. Lifewire. https://www.lifewire.com/what-is-hsv-in-design- 1078068 Dayala, R. (2020, August 7). Color Filtering/Segmentation/Detection – HSV. Computer Vision. https://cvexplained.wordpress.com/2020/04/28/color-detection- hsv/#:~:text=In%20OpenCV%2C%20Hue%20has%20values,2%2C%203%20and%20so% on. Fernando, S. R. (n.d.). Introduction. OpenCV Tutorial C++. https://www.opencv- srf.com/p/introduction.html Gad, A., Basmaji, T., Yaghi, M., AlHeeh, H., Alkhedher, M., & Ghazal, M. (2022, September 20). Multiple Object Tracking in Robotic Applications: Trends and Challenges. Applied Sciences. https://doi.org/10.3390/app Guo, D., Van De Ven, A. L., & Zhou, X. (2014, May 1). Red Blood Cell Tracking Using Optical Flow Methods. IEEE Journal of Biomedical and Health Informatics. https://doi.org/10.1109/jbhi.2013. How is object tracking used in medicine? | 5 Answers from Research papers. (n.d.). SciSpace

  • Question. https://typeset.io/questions/how-is-object-tracking-used-in-medicine- 3hivhm8ymn Rani, S., Singh, B. K., Koundal, D., & Athavale, V. A. (2022, September 1). Localization of stroke lesion in MRI images using object detection techniques: A comprehensive review. Neuroscience Informatics. https://doi.org/10.1016/j.neuri.2022. OpenCV: Changing Colorspaces. (n.d.). https://docs.opencv.org/3.4/df/d9d/tutorial_py_colorspaces.html OpenCV: Eroding and Dilating. (n.d.). https://docs.opencv.org/3.4/db/df6/tutorial_erosion_dilatation.html OpenCV: Introduction. (n.d.). https://docs.opencv.org/4.x/d1/dfb/intro.html OpenCV: opencv2/core.hpp File Reference. (n.d.). https://docs.opencv.org/3.4/da/d47/core_8hpp.html OpenCV: opencv2/highgui.hpp File Reference. (n.d.). https://docs.opencv.org/4.x/d4/dd5/highgui_8hpp.html P. (n.d.). ASCII code Escape, American Standard Code for Information Interchange, The complete ASCII table, characters,letters, vowels with accents, consonants, signs, symbols,

Anexos:

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include #include #include using namespace cv; using namespace std; int main() { WindowFlags::WINDOW_AUTOSIZE; VideoCapture capWebcam(0); if (!capWebcam.isOpened()) { cout << "Erro: Falha na ligação à câmara\n"; return 0; } setlocale(LC_ALL, "Portuguese"); int cor, forma; float o = 0; cout << "\nBem-vindo! Este código realiza a deteção de objetos circulares, triangulares e quadriláteros, da cor que pretender." << endl; cout << "\nCores disponíveis: \n1- Amarelo \n2- Azul \n3- Vermelho" << endl;

do { if (o > 0) { cin.clear(); cin.ignore(256, '\n'); cout << "Erro! Introduza uma opção de cor válida! \n"; } cout << "Comece por escolher a cor do objeto \n"; cin >> cor; o++; } while (!cin || (cor < 1 || cor > 3)); o = 0; cout << "Opções de formas geométricas: \n4- Círculo \n5- Triângulo \n6- Quadrilátero" << endl; do { if (o > 0) { cin.clear(); cin.ignore(256, '\n'); cout << "Erro! Introduza uma opção de forma geométrica válida!\n"; } cout << "Selecione agora a forma do objeto. \n"; cin >> forma;

cor_limite = Scalar(0, 255, 255); //define-se esta variável de modo a que o objeto seja delimitado com a mesma cor que o utilizador escolher (mesma cor do objeto) break; case 2: // azul low_H = 90; high_H = 120; low_S = 50; high_S = 255; low_V = 50; high_V = 225; cor_limite = Scalar(0, 255, 0); break; case 3: // vermelho low_H = 0; high_H = 10; low_S = 100; high_S = 255; low_V = 100; high_V = 225;

cor_limite = Scalar(0, 0, 255); break; } while (charCheckForEscKey != 27 && capWebcam.isOpened()) { bool blnFrameReadSuccessfully = capWebcam.read(Orig_img); if (!blnFrameReadSuccessfully || Orig_img.empty()) { cout << "Erro: Não foi possível ler o frame\n"; break; } cvtColor(Orig_img, Hist_img, COLOR_BGR2HSV); findContours(Img_t, contornos, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); for (size_t i = 0; i < contornos.size(); i++) { double perimeter = arcLength(contornos[i], true); vector approx; approxPolyDP(contornos[i], approx, 0.04 * perimeter, true); switch (forma) { case 4: // Círculo inRange(Hist_img, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), Img_t); GaussianBlur(Img_t, Img_t, cv::Size(3, 3), 0);