A. Python

Python é uma linguagem de programação versátil, que tem a filosofia de simplificar o processo de criação de software permitindo que os programadores expressem seus programas utilizando menos linhas de código.

O Python é uma linguagem interpretada, isto é, o código fonte de um programa é passado a um software chamado de interpretador, que lê os comandos e os executa de acordo com o que está especificado no código. A interpretação é um método alternativo à compilação, no qual todo o código fonte é traduzido para a linguagem de máquina (código binário que o processador consegue entender), sendo executado diretamente sem a necessidade de um software intermediário. Durante a compilação, um outro software (o compilador) precisa ser acionado ao menos uma vez para realizar a tradução do código fonte. Mas, uma vez compilado, o programa se torna independente, e pode ser executado diretamente.

Em contrapartida, um programado feito em uma linguagem interpertrada precisa que o software interpretador seja acionado sempre que este for executado. O processo de interpretação pode resultar em uma redução no desempenho da execução do programa, já que é necessário executar vários outros comandos auxiliares no interpretador para cada comando contido no código fonte. A vantagem é que, em geral, é mais fácil portar programas em linguagens interpretadas. Programas compilados irão funcionar apenas na plataforma (Arquitetura de Processador e Sistema Operacional) para o qual eles foram compilados. Não adianta tentar rodar um programa compilado para funcionar em um processador ARM em um processador IA-32, as intruções contidas serão diferentes. Entretanto, caso exista um interpretador funcionando em ambas as arquiteturas, o mesmo código fonte pode ser executado sem alterações nas duas máquinas.

Além disso, existem técnicas que podem melhorar o desempenho de aplicações interpretadas. Técnicas como JIT (just-in-time compilation) e criação de códigos intermediários permitem que partes do programa sejam traduzidas ou compiladas de antemão à medida que necessário, fazendo com que essas aplicações tenham um desempenho mais próximo o de programas compilados. Essas técnicas são intermediárias entre um processo de interpretação puro e de compilação.

--Código Fonte do módulo Principal:

import cv2
import cv2.cv as cv
import numpy as np

#Funcao para ler arquivo de configuracao
def read_file(path, aux):
        file = open(path, 'rw')
        line = file.readline()
        line = line.split(" ")
        file.close()
        if len(line) == 3:
            return  np.array([int(numeric_string) for numeric_string in line], dtype=np.uint8)
        else:
            return aux


#Comeco do Programa
cap = cv2.VideoCapture(0)

posX  = 0
posY  = 0
lastX = 0
lastY = 0
scribble = np.zeros((480,640,3), np.uint8)


while(True):
    # Capturar frame
    ret, frame = cap.read()
 
    #Ler Max e Min do Arquivo
    hsv_min = read_file("min", np.array([0, 163, 160]))
    hsv_max = read_file("max", np.array([11, 255, 255]))

    #Tratamento da Imagem
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    thresholded = cv2.inRange(hsv_frame, hsv_min, hsv_max)
    thresholded = cv2.GaussianBlur(thresholded, (9, 9), 0)

    #Detectar circulos
    circles = cv2.HoughCircles(thresholded, cv.CV_HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=10, maxRadius=400)
   
    #Verificar se circulos foram encontrados
    if circles is not None:
        circles = np.uint16(np.around(circles))
     
#Plotar circulos na imagem
    for i in circles[0,:]:
        cv2.circle(frame,(i[0],i[1]),i[2],(0,255,0),2)
        cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3)
        posX = i[0] #Salvando posicao do centro do ultimo circulo encontrado
        posY = i[1]

    #Plotando linhas entre as duas ultimas posicoes
    if lastX>0 and lastY>0 and posX>0 and posY>0 :
        cv2.line(scribble, (lastX, lastY), (posX, posY), (255,0,255), 3)

    #Adicionando linhas ao frame principal
        cv2.add(frame, scribble, frame) 
    #Salvando posicao do ultimo circulo encontrado
        lastX = posX
        lastY = posY
    #Mostrar Imagens
        cv2.imshow('frame', gray)
        cv2.imshow('frame2', thresholded)
        cv2.imshow('frame3', frame)

    #Detectar pressionamento da tecla q (quit, encerra o programa)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#Liberar Recursos
cap.release()
cv2.destroyAllWindows()

Neste vídeo é apresentada a ideia de criar um programa auxiliar para ajustar a faixa de valores de cores de um objeto, permitindo que este seja isolado na imagem: www.youtube.com/watch?v=JcDZxohDq2w.

Esta ideia é aplicada com a criação de um programa em java (HSVCreator.jar), no qual é possível ajustar faixas de valores HSV para até que seja possível encontrar uma faixa que isole o objeto marcador. Este programa escreve dois arquivos: min e max, contendo 3 valores inteiros que representam os intervalos para o filtro da imagem. O programa contém uma caixa de texto na qual se deve especificar o local onde os arquivos serão salvos (os arquivos max e min devem estar no mesmo diretório do arquivo teste.py, que contém o código do programa de detecção), e um conjunto de barras para o ajuste dos valores H, S e V respectivamente.

A função read_file lê os arquivos, e os valores são passados a função cv2.inrange, que cria um bitmap definindo as posições cujos pixels estão dentro e fora da faixa de valores especificados.