














Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
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
1 / 22
Esta página não é visível na pré-visualização
Não perca as partes importantes!















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
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,
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.
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.
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
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include
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