Python
Programação Orientado a Objetos em Python

A programação orientada a objetos (POO) é um paradigma de programação que organiza o código em “objetos” – estruturas que combinam dados (atributos) e comportamentos (métodos). Python, por ser uma linguagem multiparadigma, possui um suporte robusto à POO, permitindo que desenvolvedores criem aplicações mais organizadas, reutilizáveis e de fácil manutenção. Neste artigo, abordaremos os principais princípios da orientação a objetos: encapsulamento, herança, polimorfismo e abstração, apresentando exemplos didáticos para cada um.


1. Conceitos Básicos de Orientação a Objetos

Antes de explorarmos os princípios, vamos relembrar dois conceitos fundamentais:

  • Classe: É um “molde” ou “projeto” que define os atributos (dados) e os métodos (funções) que seus objetos terão.
  • Objeto: É uma instância de uma classe. Cada objeto possui seu próprio estado, representado pelos valores dos atributos.

Exemplo simples de classe e objeto em Python:

class Pessoa:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def apresentar(self):
        print(f"Olá, meu nome é {self.nome} e tenho {self.idade} anos.")

# Criação de objetos
p1 = Pessoa("Alice", 30)
p2 = Pessoa("Bruno", 25)

p1.apresentar()  # Saída: Olá, meu nome é Alice e tenho 30 anos.
p2.apresentar()  # Saída: Olá, meu nome é Bruno e tenho 25 anos.

2. Princípios da Orientação a Objetos

2.1 Encapsulamento

Encapsulamento é o mecanismo que agrupa dados e métodos que operam sobre esses dados dentro de uma mesma unidade (classe), restringindo o acesso direto a alguns componentes. Isso ajuda a proteger o estado interno do objeto e permite modificar a implementação interna sem afetar a interface pública.

Exemplo de encapsulamento com atributos privados:

class ContaBancaria:
    def __init__(self, saldo_inicial):
        self.__saldo = saldo_inicial  # Atributo privado

    def depositar(self, valor):
        if valor > 0:
            self.__saldo += valor
            print(f"Depósito de R${valor} realizado com sucesso.")

    def sacar(self, valor):
        if 0 < valor <= self.__saldo:
            self.__saldo -= valor
            print(f"Saque de R${valor} realizado com sucesso.")
        else:
            print("Saldo insuficiente ou valor inválido.")

    def mostrar_saldo(self):
        print(f"Saldo atual: R${self.__saldo}")

# Uso da classe
conta = ContaBancaria(1000)
conta.depositar(500)
conta.sacar(300)
conta.mostrar_saldo()

# A tentativa de acesso direto ao atributo privado resultará em erro:
# print(conta.__saldo)  -> AttributeError

No exemplo acima, o atributo __saldo é privado e não pode ser acessado diretamente fora da classe. Os métodos depositar, sacar e mostrar_saldo formam a interface pública para interagir com esse dado.


2.2 Herança

Herança permite que uma classe herde atributos e métodos de outra, promovendo a reutilização de código e a criação de hierarquias. A classe que herda é chamada de subclasse ou classe derivada, enquanto a classe de onde se herda é chamada de superclasse ou classe base.

Exemplo de herança:

class Veiculo:
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo

    def exibir_info(self):
        print(f"Marca: {self.marca}, Modelo: {self.modelo}")

# Classe derivada que herda de Veiculo
class Carro(Veiculo):
    def __init__(self, marca, modelo, portas):
        super().__init__(marca, modelo)  # Chama o construtor da superclasse
        self.portas = portas

    def exibir_info(self):
        super().exibir_info()
        print(f"Portas: {self.portas}")

# Uso das classes
veiculo = Veiculo("Genérico", "Modelo X")
veiculo.exibir_info()

print("----")

carro = Carro("Toyota", "Corolla", 4)
carro.exibir_info()

Aqui, a classe Carro herda de Veiculo e adiciona o atributo portas, além de sobrescrever o método exibir_info para incluir informações específicas do carro.


2.3 Polimorfismo

Polimorfismo é a capacidade de diferentes classes responderem de forma específica à mesma mensagem (método). Ou seja, métodos com o mesmo nome podem ter implementações diferentes em classes distintas.

Exemplo de polimorfismo:

class Animal:
    def emitir_som(self):
        pass  # Método abstrato, sem implementação

class Cachorro(Animal):
    def emitir_som(self):
        print("Au Au")

class Gato(Animal):
    def emitir_som(self):
        print("Miau")

# Função que recebe um objeto do tipo Animal e chama emitir_som
def fazer_animal_emitir_som(animal):
    animal.emitir_som()

# Uso do polimorfismo
cachorro = Cachorro()
gato = Gato()

fazer_animal_emitir_som(cachorro)  # Saída: Au Au
fazer_animal_emitir_som(gato)      # Saída: Miau

Apesar dos objetos Cachorro e Gato serem instâncias de classes diferentes, ambos implementam o método emitir_som. Assim, a função fazer_animal_emitir_som pode receber qualquer objeto derivado de Animal e executar o método correspondente.


2.4 Abstração

Abstração consiste em ocultar os detalhes de implementação e mostrar apenas a funcionalidade essencial ao usuário. Em Python, podemos utilizar classes abstratas para definir métodos que devem ser implementados por suas subclasses. A biblioteca abc (Abstract Base Classes) facilita a criação de classes abstratas.

Exemplo de abstração usando o módulo abc:

from abc import ABC, abstractmethod

class FormaGeometrica(ABC):
    @abstractmethod
    def calcular_area(self):
        pass

class Quadrado(FormaGeometrica):
    def __init__(self, lado):
        self.lado = lado

    def calcular_area(self):
        return self.lado ** 2

class Circulo(FormaGeometrica):
    def __init__(self, raio):
        self.raio = raio

    def calcular_area(self):
        import math
        return math.pi * (self.raio ** 2)

# Tentativa de instanciar a classe abstrata gera erro:
# forma = FormaGeometrica()  -> TypeError

# Uso das classes concretas
quadrado = Quadrado(4)
circulo = Circulo(3)

print(f"Área do quadrado: {quadrado.calcular_area()}")  # Saída: 16
print(f"Área do círculo: {circulo.calcular_area():.2f}")  # Saída: valor aproximado

No exemplo, FormaGeometrica é uma classe abstrata que define o método calcular_area como abstrato. As classes Quadrado e Circulo implementam esse método de acordo com suas fórmulas específicas.


Conclusão

A orientação a objetos em Python oferece uma maneira estruturada e intuitiva de organizar o código. Ao utilizar os princípios de encapsulamento, herança, polimorfismo e abstração, os desenvolvedores podem criar sistemas mais robustos, modulares e fáceis de manter. Esperamos que os exemplos apresentados neste artigo ajudem a compreender melhor esses conceitos e inspirem a aplicação deles em seus projetos!

C/C++ OPENGL
Open-Asset-Importer-Lib

O uso do Open GL em Linux ou Windows não é tarefa fácil.

Iremos descrever o procedimento de instalação de uma biblioteca de importação de modelos 3D para Open GL.

Esta biblioteca permite carregar diversos arquivos de modelos complexos, e importar para o padrão do open gl.

Desta forma criar padrões de objetos complexo em seu projeto.

O Open-Asset_Importer-Lib é uma biblioteca aberta.

O site do fabricante:

https://assimp.org

Github do projeto:

https://github.com/assimp/assimp

Instalação

1 – Instale usando o apt, os seguintes pacotes:

sudo apt install assimp-utils libassimp-dev libassimp5

2 – Agora instale os fontes do projeto

git clone https://github.com/assimp/assimp.git

3 – Agora iremos compilar o projeto

3.1 – Entre na pasta assimp

3.2 – Prepare o projeto com CMAKE, ele prepara o Makefile para compilação

cmake .

3.3 – Compile o projeto.

make 

3.4 – Faça a instalação do pacote

sudo make install

Pronto.

Criando o primeiro programa

Crie um bash.

#!/bin/bash
CC=g++
CPPFLAGS=pkg-config --cflags glew ImageMagick++ assimp
CPPFLAGS="$CPPFLAGS -I../Include"
LDFLAGS=pkg-config --libs glew assimp`
LDFLAGS="$LDFLAGS -lglut -lX11"
$CC tutorial18.cpp ../Common/ogldev_util.cpp ../Common/math_3d.cpp ../Common/ogldev_texture.cpp ../Common/3rdparty/stb_image.cpp ../Common/ogldev_wordtransform.cpp camera.cpp ../Common/ogldev_basic_mesh.cpp $CPPFLAGS $LDFLAGS -o tutorial18

Referencia de treinamento

Este material foi possível, graças a este treinamento:

LARAVEL PHP
Criação de Controller no Laravel

Para criar um controller no laravel, utilize a seguinte sintaxe:

php artisan make:controller <nomecontroller>

Os controller serão criados na pasta:

.\app\Http\Controllers

Conforme o exemplo abaixo:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class welcomeController extends Controller
{
    //Metodo de visualização
    public function welcome(){
          return view('welcome');

    }
         
}            

É necessário criar o mesmo na rota (web.php):

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\WelcomeController;

Route::get('/', function () {
    $controller  = new welcomeController();
    return $controller->welcome();
});
     
Python
Debugando em Python

O debug de script em python é bem simples.

Entre o seguinte import, no bloco que quer debugar.

import pdb

Para inserir um ponto de parada use o comando.

pdb.set_trace()

Desta forma é possível realizar um debug por linha de comando semelhante ao gdb do c.

Para rodar o python em modo debug use o comando:,

python -m pdb [script.py]

Irei em momento oportuno mostrar maiores detalhes desta técnica.

IA Python
Keras – Topologia

Topologia baseada em empilhamento

Modelo sequencial

  • Densa – Totalmente conectada
  • Embedding –
  • Dropout – Remove conexões aleatórias

Função de ativação

Cada camada tem uma função de ativação.

Entre elas:

  • relu – camadas intermediarias ou ocultas, pois mostra os valores reais.
  • sigmoid – Te da um valor de probabilidade 0-1

Hiper parâmetros

Afeta a performace da rede.

  • LOSS – função de perda (mean_squared_error)
  • Optimizer – Otimizador de ajuste de pesos da rede. ADAM (stochastic gradient descent)
  • Metrics – Metrica de previsão para apurar se esta certo.

Exemplo de modelo

modelo = Sequental()

modelo.add(tipo)

modelo.add(Dropout(0.2))

modelo.add(tipo)

modelo.add(Dropout(0.2))

modelo.add(tipo)

modelo.add(Dropout(0.2))

Tipos:

#camadas intermediarias

Dense(output_dim=10, input_dim=X_train.shape[1], activation=’relu’))

#Camada de finalização

Dense(output_dim=10, input_dim=X_train.shape[1], activation=’sigmoid’))

C/C++ Desenvolvimento de Software Python
Desenvolvimento com KINECT

No primeiro artigo, apresentei a instalação do kinect no ubuntu.

Artigo tratando o kinect no ubuntu

Agora iremos falar e mostrar um pouco sobre seu desenvolvimento.

GITHUB do Projeto

O projeto do libfreenect fica neste repositório.

https://github.com/OpenKinect/libfreenect.git

Site do Projeto

https://openkinect.org/wiki/Low_Level

Meu GITHUB

Ja os meus conjuntos de testes, inclusive os apresentados nos artigos relacionados, podem ser vistos, neste repositório.

https://github.com/marcelomaurin/kinect

Instalação de desenvolvimento

O processo de instalação completo foi visto no artigo anterior, porem para efeito de desenvolvimento os pacotes necessários são:

sudo apt install libudev-dev
sudo apt install libglfw3-dev
sudo apt install freeglut3-dev
sudo apt install libfreenect-dev

Sendo os 3 pacotes iniciais, apenas apoio, e o libfreenect-dev realmente a lib necessária.

Hello World da Biblioteca

Neste primeiro projeto, pouca coisa faremos, apenas iremos compilar identificando o device.

#include <stdio.h>
#include <stdlib.h>
#include <libfreenect.h>

freenect_context *f_ctx;
freenect_device *f_dev;
int user_device_number = 0; // Normalmente 0 se você tiver apenas um Kinect

void depth_cb(freenect_device *dev, void *v_depth, uint32_t timestamp) {
    // Callback para dados de profundidade - não usado neste exemplo
}

void rgb_cb(freenect_device *dev, void *rgb, uint32_t timestamp) {
    // Salva uma imagem RGB capturada pelo Kinect
    FILE *image = fopen("output_image.ppm", "wb");
    if (image == NULL) {
        printf("Erro ao abrir o arquivo para escrita\n");
        return;
    }
    fprintf(image, "P6\n# Kinect RGB test\n640 480\n255\n");
    fwrite(rgb, 640*480*3, 1, image);
    fclose(image);
    printf("Imagem salva como output_image.ppm\n");

    // Depois de salvar a imagem, podemos sair do loop principal
    freenect_stop_video(dev);
    freenect_close_device(dev);
    freenect_shutdown(f_ctx);
    exit(0);
}

int main() {
    if (freenect_init(&f_ctx, NULL) < 0) {
        printf("freenect_init() falhou\n");
        return 1;
    }

    if (freenect_open_device(f_ctx, &f_dev, user_device_number) < 0) {
        printf("Não foi possível abrir o dispositivo\n");
        freenect_shutdown(f_ctx);
        return 1;
    }

    freenect_set_depth_callback(f_dev, depth_cb);
    freenect_set_video_callback(f_dev, rgb_cb);
    freenect_set_video_mode(f_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_RGB));

    freenect_start_video(f_dev);

    while (freenect_process_events(f_ctx) >= 0) {
        // Processa eventos do Kinect até que a captura de imagem seja concluída
    }

    return 0;
}

Neste exemplo o programa pega o kinect e tira uma foto, salvando na maquina local.

Vamos entender o código.

A freenect_init inicia a api.

A próxima função freenect_open_device, abre o device conforme o número que estiver descrito. Isso permite abrir mais de um kinect na mesma maquina.

As funções freenect_set_depth_callback e freenect_set_video_callback criam funções de callback, para controle, se voce não sabe o que é leia este artigo:

A função freenect_set_video_mode indica os parâmetros de resolução.

Por ultimo a função freenect_start_video, dá inicio ao kinect que aciona o callback quando pronto.

Makefile

Criamos aqui o arquivo de compilação do projeto.

CC=gcc
CFLAGS=-c -Wall -I/usr/include/libfreenect
LDFLAGS=-L/usr/lib/x86_64-linux-gnu -lfreenect
SOURCES=kinect.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=kinect

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
	$(CC) $(OBJECTS) -o $@ $(LDFLAGS)

.c.o:
	$(CC) $(CFLAGS) $< -o $@

clean:
	rm -f $(OBJECTS) $(EXECUTABLE)

Perceba aqui que o pulo do gato neste makefile, é a inclusão da pasta /usr/lib/x86_64-linux-gnu que é onde a lib se encontra. Bem como a /usr/include/libfreenect que é onde o header se encontra.

Compilando o projeto

Para compilar esse projeto, é necessário apenas rodar o script na pasta src do ubuntu:

make all

Compilando o projeto

Rodando o programa

Agora iremos rodar o programa, isso é a parte mais simples.

Ao rodar, ele captura uma foto, e salva, conforme apresentado.

Foto capturada pelo kinect.

C/C++ srvOuve
Reconhecimento de Voz ONLINE no srvOuve
Reconhecimento de voz usando o srvOuve, permite ouvir o que se diz.

O srvOuve, é um projeto de minha autoria, que permite criar aplicação de Voz para Texto. Neste projeto, iremos utilizar várias abordagens diferentes, para criar uma aplicação para atender essa finalidade.

Neste primeiro projeto finalizado, criamos um serviço de voz para texto que precisa ser online.

GITHUB

https://github.com/marcelomaurin/srvOuve

Vantagem

O projeto srvOuve, permite utilizar diversos serviços diferentes, ouvindo tanto online como offline, unificando assim a forma de obter esses serviços em um único canal.

Permitindo criar integrações mais ageis.

No exemplo do vídeo usamos o MNote como ferramenta de integração. Onde ele recebe o texto “escutado” pelo srvOuve e repassa ao CHATGPT, permitindo assim que esse responda, e depois convertendo em texto de voz, através do srvFalar, outro projeto de minha autoria.

IA OPENCV Programação
Kinect 365 no UBUNTU

Este é um roteiro de instalação e preparação do seu UBUNTU para rodar o kinect.

O Kinect é parte integrante do XBOX 365, que apesar de já bem antigo (2024) ainda é uma tecnologia disruptiva, trazendo muitos benefícios para quem trabalha com IA e processamento de imagem.

O intuito deste tutorial é demonstrar o que é necessário para rodar o kinect no PC com linux.

Hardware

Logicamente, o kinect 365 é necessário.

Porem não somente ele, o hardware foi construído para o XBOX e possui um conector proprietário, que precisa alem de um adaptador, também de fonte externa para o PC.

Voce pode facilmente encontrar este adaptador se procurar “adaptador kinect xbox PC” em qualquer site de compras.

Software

Existe um pacote para linux que permite rodar o kinect, é o libfreenect.

Se olharmos na lista de repositórios do ubuntu por freenect, encontraremos os seguintes pacotes:

  • freenect – library for accessing Kinect device — metapackage
  • libfreenect-bin – library for accessing Kinect device — utilities and samples
  • libfreenect-demos -library for accessing Kinect device — dummy package
  • libfreenect-dev – library for accessing Kinect device — development files
  • libfreenect-doc – library for accessing Kinect device — documentation
  • libfreenect0.5 – library for accessing Kinect device

Para instalar esses pacotes siga o roteiro, instalando primeiro os pacotes requeridos.

sudo apt install build-essential cmake
sudo apt install libusb-1.0-0-dev
sudo apt install python-dev python-numpy
sudo apt install swig
sudo apt install libudev-dev
sudo apt install libglfw3-dev
sudo apt install freeglut3-dev

Agora iremos instalar os pacotes

sudo apt install freenect
sudo apt install libfreenect-bin
sudo apt install libfreenect-demos
sudo apt install libfreenect-dev
sudo apt install libfreenect-doc
sudo apt install libfreenect0.5

Testando o Kinect

Existe um conjunto de demos que foram criados para permitir usar o kinect. Vamos entender cada um.

  • freenect-camtest: Uma ferramenta de teste para verificar o funcionamento básico das câmeras RGB e de profundidade do Kinect.
  • freenect-chunkview: Utilitário para visualizar dados de “chunk” (pedaço), útil para debugar ou entender como os dados são transferidos do Kinect.
  • freenect-cpp_pcview: Um visualizador de nuvem de pontos escrito em C++, demonstrando como processar e visualizar dados de profundidade em 3D.
  • freenect-cppview: Similar ao freenect-cpp_pcview, oferece uma visualização básica da saída RGB e de profundidade usando C++.
  • freenect-glview: Provavelmente um dos exemplos mais usados, oferece uma visualização ao vivo simples das câmeras RGB e de profundidade usando OpenGL.
  • freenect-glpclview: Uma ferramenta avançada para visualizar a saída do Kinect como uma nuvem de pontos 3D, utilizando a biblioteca PCL (Point Cloud Library) e OpenGL para renderização.
  • freenect-hiview: Uma ferramenta de visualização que pode ser usada para exibir dados de alta resolução do Kinect.

Teste com freenect-glview

Demonstra o uso do kinect.

No nosso próximo artigo, irei demonstrar o uso do kinect, e fazer um exemplo de código em C.

Espero que tenham gostado.

Python
Criando uma matriz de confusão no python

Para criar uma matriz de confusão no python, usaremos as bibliotecas do scikit-learn, para tanto, precisaremos instalar.

pip install scikit-learn

Segue abaixo o código, onde faremos a matriz de confusão.

from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

# Valores reais (verdadeiros)
y_true = [2, 0, 2, 2, 0, 1]

# Valores previstos pelo modelo
y_pred = [0, 0, 2, 2, 0, 2]

# Gerar a matriz de confusão
conf_matrix = confusion_matrix(y_true, y_pred)

# Imprimir a matriz de confusão
print("Matriz de Confusão:")
print(conf_matrix)

# Para uma visualização melhor, você pode usar a biblioteca Seaborn para plotar a matriz de confusão
plt.figure(figsize=(10,7))
sns.heatmap(conf_matrix, annot=True, fmt="d")
plt.xlabel('Valores Previstos')
plt.ylabel('Valores Verdadeiros')
plt.title('Matriz de Confusão')
plt.show()

No código acima, podemos ver dois vetores, y_true, y_pred, onde os valores obtidos na leitura dos itens estão no vetor y_pred.

A matriz de referencia, é posta no y_true.

Por fim criamos a matriz de confusão:

conf_matrix = confusion_matrix(y_true, y_pred)

Criação da matriz de confusão

maurinsoft.com.br