You are currently browsing the category archive for the ‘C/C++’ category.

A nova versão do CERTIFACE VISION processa com algorítmo próprio a EXCLUSÃO DE FUNDO junto ao processamento dos atributos da ISO 19794-5 utilizado em aplicações de biometria facial. O grande diferencial desta versão é a correção do bug de influência matemática interna do fluxo dos pixels durante a extração do fundo com câmeras 3D. Ao final deste post um vídeo demonstrativo.

Screenshot_20170312_214716

Para entender melhor o problema proposto, a seguir uma imagem com o erro de influência matemática no recorte e/ou subtração  do fundo baseado em técnicas 3D.

frame04

No video demonstrativo, constatamos a eficiência do processamento em tempo real do Certiface VISION.

Neste vídeo disponibilizo os testes de Face Trackin com GPU ATI após instalação do driver da ATI (post anterior) junto ao AMD SDK.

Write in C
When I find my code in tons of trouble,
Friends and colleagues come to me,
Speaking words of wisdom:
“Write in C.”

As the deadline fast approaches,
And bugs are all that I can see,
Somewhere, someone whispers:
“Write in C.”

Write in C, write in C,
Write in C, oh, write in C.
LISP is dead and buried,
Write in C.

I used to write a lot of FORTRAN,
For science it worked flawlessly.
Try using it for graphics!
Write in C.

If you’ve just spent nearly 30 hours
Debugging some assembly,
Soon you will be glad to
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
BASIC is for wimps.
Write in C.

Write in C, write in C,
Write in C, oh, write in C.
Pascal won’t quite cut it.
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
Don’t even mention COBOL.
Write in C.

And when the screen is fuzzy,
And the editor is bugging me.
I’m sick of ones and zeros,
Write in C.

A thousand people swear that T.P.
Seven is the one for me.
I hate the word PROCEDURE,
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
PL1 is ’80s,
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
The government loves ADA,
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
Java’s not quite there yet,
Write in C.

Após os testes com o a biblioteca openCV na GPU conforme o post anterior, agora compilei a openCV também com a lib TBB. Resultado: a aplicação que estava processando aproximadamente 120 FPS passou a processar mais de 170 FPS. Tudo isto em função da programação paralela. Escrito em C++.O TBB se encarrega na adaptação do software, ou seja determinando o número ideal de threads e tornando uma realidade a programação multinúcleo.

Hoje precisei converter diversos arquivo (código-fontes) de um projeto para o formato PDF. O principa desafio era converter apenas os arquivos fontes e excluir os arquivos de imagens, binário e outros. Deixo aqui a minha jornada…

Em primeiro lugar devemos baixar e compilar o código fonte text2pdf. Este código, como o próprio nome diz converte um arquivo texto em pdf, para compilar o software basta executar o comando abaixo:

$ gcc text2pdf.c -o text2pdf

O proximo passo é criar uma lista dos arquivos fontes que deverão sofrer a conversão.

$ find . \( -name '*.c' -o -name '*.as' -o -name '*.java' -o -name '*.jsp'
-o -name '*.css' -o -name '*.js' \) > gerarpdf.txt

Agora confira o conteúdo do arquivo recém-criado para somente depois converter os arquivos selecionados:

$ cat gerarpdf.txt | while read a; do cat -b $a | ./text2pdf > $a.pdf;  done

Se desejar apagar todos os arquivos exceto os PDFs, basta criar uma nova lista e conferir o seu conteúdo.

$ find . ! -name '*.pdf' > apagar

Para realmente apagar os arquivos, abaixo o comando:

$ cat apagar | xargs rm

Claro que existe outras maneiras, mas acabei tomando este caminho e compartilhando toda execução.

Baseado na geometria analítica com o plano cartesiano podemos estabelecer a distância entre os pontos A e B. Verificamos que a distância entre os pontos A e B é a hipotenusa do triângulo retângulo, que pode ser calculada aplicando o Teorema de Pitágoras.

Baseado na teoria de Pitágoras, a distância entre dois pontos é:Então, para calcularmos a ditância entre os prontos (1, 2) and (5, 7) devemos:

Abaixo as funções para retornar a distrancia entre dois pontos utilizando a strutura cvPoint da biblioteca opencv.

float icvDistanceL2_32s( CvPoint pt1, CvPoint pt2 )
{
 int dx = pt2.x - pt1.x;
 int dy = pt2.y - pt1.y;
 return cvSqrt( (float)(dx*dx + dy*dy));
}

float  icvDistanceL2_32f( CvPoint2D32f pt1, CvPoint2D32f pt2 )
{
 float dx = pt2.x - pt1.x;
 float dy = pt2.y - pt1.y;
 return cvSqrt( (float)(dx*dx + dy*dy));
}

Viva Pitágoras

Que vergonha… não criei sincronismo ao capturar o frame do buffer na biblioteca libhaircapture  (derivado da correria para entreta de um projeto, mas não justifica… ). Ao capturar a imagem, a falta de sincronimo pode gera um quadro com  metade do frame atual e a outra metade do frame anterior.

O erro foi constatado graças ao Stage (o Luiz Fernando) que trabalha na NETi, pois os seus testes exaustivos acabou demonstrando esta falha (foi mal…). Poderia implementar a técnica de semáforo, mas um simples mutex é o suficiente para sincronizar e resolver o problema. Para quem deseja fazer uma prova de conceito, abaixo um código básico.

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t r3_mutex=PTHREAD_MUTEX_INITIALIZER;

void* print(void )
{
   pthread_mutex_lock(&r3_mutex);
   printf("Aguarando 10 segundos dentro thread. 2\n");
   sleep(10);
   pthread_mutex_unlock(&r3_mutex);
   printf("Thread finalizada.\n");
   pthread_exit(NULL);
}

int main (int argc, char** argv)
{
   pthread_t threads;

   pthread_create(&threads, NULL, (void *(*)(void *))print, NULL);
   printf("Aguarando 2 segundos (sleep fora da thread). \n");
   sleep(2);
   printf("Aguarando 10 segundos restante (sleep dentro da thread). \n");
   pthread_mutex_lock(&r3_mutex);
   printf("Realmente constatada, thread finalizada.\n");
   printf("Processando algo... \n");
   pthread_mutex_unlock(&r3_mutex);
   printf("Process main finalizado\n");

   return 0;
}

Conforme mencionei nos posts anteriores, neste vídeo veremos a  terceira fase evolutiva dos testes laboratoriais para o projeto de contagem de pessoas baseada na densidade do fluxo ótico.

gccegg-65Suponhamos que ao compilarmos um software, ocorre o seguinte  erro:

$ g++  programa.cc -o programa/lib/libguide.so: undefined reference to `pthread_atfork'collect2: ld returned 1 exit status$

Entre no site http://dev.linuxfoundation.org/dbadmin/commons/search.php e busque a  referência  da chamada pthread_atfork ou __pthread_atfork. E pronto! Teremos como resultado a libpthread Yes! Agora basta referência-la na compilação.

$ g++  programa.cc -o programa -lpthread

Já me deparei com  muito  código em C/C++ declarando matrizes como no exemplo a seguir:

int m[100000000];

Abaixo uma  maneira simples  para declarar e  dimensionar uma matriz durante  a  execução do  programa:

int* a = NULL;   // Inicializa o ponteiro
int n;           // Tamanho da matriz
cin >> n;        // Entrada de dados para o tamanho da matriz
a = new int[n];  // Allocação
for (int i=0; i<n; i++)
{
   a[i] = 0;       // atribuindo os valores para  cada elemento.
}
. . .  
delete [] a;  // Liberando a memória
a = NULL;

Arquivo

Statísticas

  • 550,158 Acessos

ATENÇÃO!

 °v° USE A FORÇA,
/(_)\ LEIA OS FONTES !
 ^ ^

openSUSE 11.4