Hola a todos, soy nuevo en este foro y vengo con ganas de compartir mis códigos y poder aprender de los vuestros.
Estoy buscando la manera de hacer una captura con la webcam de manera silenciosa, hasta he conseguido hacer la foto con el código de abajo, pero me sale una ventana para elegir un programa externo que me haga la foto, lo selecciono y me hace la foto, la función que lo hace es capDriverConnect(), lo que quiero es que haga la foto sin que salga esa ventana, es decir elegir el driver o programa que haga la foto de otra forma:
#define MY_BUFSIZE 1024
#include <windows.h>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <vfw.h>

using namespace std;

void photo();

void photo()
{
	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", M_COMMAND, 0, 0, 640, 480, hwndMain, 0);//NULL para que no se vea la ventana.
	capDriverConnect(hwndVideo, 0);//Esta función abre una ventana y me pide elegir un driver para hacer la foto (ciberlink...)
	capPreviewRate(hwndVideo, 66);
	capPreview(hwndVideo, true);
	
	capDlgVideoSource(hwndVideo);

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

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

	capPreview(hwndVideo, FALSE);
	DestroyWindow(hwndVideo);
	hwndVideo = NULL;
}
Estoy probando también con esto para capturar el driver:
/*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;
			}
		}
Es equivalente, sigue saliendo la ventana y tengo que elegir el driver, me pregunto si alguno de ustedes saben como hacer equivaler esa función sin sacar la ventana.

Saludos.
Busca y sigue tu camino sin importar el final ni el destino.
Gracias por la respuesta pink, no tenía el OPEN CV así que no pude probar el código, me descargué el instalador en la página oficial y al ejecutarlo me descomprimió varios archivos en el directorio que le indiqué pero aún así no se como linkar la "highgui.h", de todas formas estoy en ello si encuentro la manera la pongo y pruebo.

He movido todos los archivos de la carpeta opencv2 a la carpeta de encabezado del proyecto uso MVS13, pero aun así no reconoce las cabeceras y no me funciona nada, ¿cómo debo hacerlo?

Saludos.
Busca y sigue tu camino sin importar el final ni el destino.
Hola, ayer estuve toda la noche y conseguí linkar el Open CV a mi visual studio 2013, con esa librería la verdad es fácil hacer fotos y no me da problemas (pues no sale la ventana y se pueden hacer de manera silenciosa), sin embargo os dejo el siguiente código:
#include <windows.h>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <vfw.h>

#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>


using namespace cv;
using namespace std;

int main() {

	CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);
	if (!capture)
	{
		fprintf(stderr, "ERROR: capture is NULL \n");
		getchar();
		return -1;
	}
	// Create a window in which the captured images will be presented
	//cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE);
	// Show the image captured from the camera in the window and repeat
	IplImage* frame = cvQueryFrame(capture);
	if (!frame)
	{
		fprintf(stderr, "ERROR: frame is null...\n");
		getchar();
		exit(0);
	}
	//cvShowImage("mywindow", frame);
	// Do not release the frame!

	if (cvWaitKey(10) < 0)
	{
		cvSaveImage("matteo.jpg", frame);
	}
	//if ((cvWaitKey(10) & 255) == 27) break;
	// Release the capture device housekeeping
	cvReleaseCapture(&capture);
	//cvDestroyWindow("mywindow");
	return 0;
}
Este código hace la foto y como si nada, el problema es que en la foto me sale el icono de ciberlink me sale una cámara y no hace la foto (ya me ocurría antes cuando al elegir programa para hacer la foto seleccionaba ciberlink no se activaba la camara y en su lugar aparecía una webcam XD), sin embargo si le daba a HP services si me hacía la foto, luego tengo que buscar el programa que me haga la foto, en este caso no es ciberlink, estoy buscando la forma de llamar a otro capturador, si sabéis algo decidme que soy nuevo en el open CV xD.

Saludos
Busca y sigue tu camino sin importar el final ni el destino.
Hola ya lo he conseguido, solo era cambiar esta línea, en mi caso:
CvCapture* capture = cvCaptureFromCAM(1);
Pues en mi caso el driver "0" es ciberlink (que no hace la foto te muestra una imagen una webcam), y "1" es HP services que enciende la cámara y hace la foto.

Pero claro esto funciona solo para mi ordenador, luego tendría que buscar un código que me asegure que se hace la foto y no una imagen de webcam de ciberlink u otro programa troll xD. Pues een mi ordenador el "0" es ciberlink pero igual otro usuario el "0" es HP services y si pongo "1" igual no tiene nada, podría recorrer desde 0 a 5 en un for, y hacer <=5 fotos pero no lo veo viable.

¿Qué opináis acerca de esto?

Gracias.
Busca y sigue tu camino sin importar el final ni el destino.
Responder

Volver a “C/C++”