una pixeles mostrar los imagen grises escala crear convertir con acceder c++ opencv computer-vision

c++ - pixeles - Guardar una imagen en OpenCV



opencv save image c++ (15)

Soy nuevo en OpenCV e intento capturar una imagen y luego guardarla en un archivo. Estoy publicando el código para su referencia, a continuación.

El archivo jpg se está guardando, pero es negro.

// Capture the Image from the webcam CvCapture *pCapturedImage = cvCreateCameraCapture(0); // Get the frame IplImage *pSaveImg = cvQueryFrame(pCapturedImage); // Save the frame into a file cvSaveImage("test.jpg". ,pSaveImg); // A JPG FILE IS BEING SAVED // OF 6KB , BUT IT IS BLACK

Todas las funciones son exitosas. He probado el código anterior en XP y Vista, el resultado es una imagen negra en ambos. Por favor, hágame saber lo que me estoy perdiendo.


A veces, la primera llamada a cvQueryFrame () devuelve una imagen vacía. Tratar:

IplImage *pSaveImg = cvQueryFrame(pCapturedImage); pSaveImg = cvQueryFrame(pCapturedImage);

Si eso no funciona, intente seleccionar el dispositivo de captura automáticamente:

CvCapture *pCapturedImage = cvCreateCameraCapture(-1);

O puede intentar seleccionar otros dispositivos de captura donde n = 1,2,3 ...

CvCapture *pCapturedImage = cvCreateCameraCapture(n);

PD: También creo que hay un malentendido sobre la imagen capturada mirando tu nombre de variable. La variable pCapturedImage no es una imagen, es una captura. Siempre puede ''leer'' una imagen desde la captura.


Creo que simplemente la cámara no se inicializa en el primer fotograma. Intenta guardar la imagen después de 10 cuadros.


De mis experiencias, los primeros cuadros que se capturan al usar:

frame = cvQueryFrame( capture );

Tienden a estar en blanco. Es posible que desee esperar un momento (aproximadamente 3 segundos) y luego intente capturar la imagen.


En OSX, guardar marcos de video e imágenes fijas solo funcionó para mí cuando di una ruta completa a cvSaveImage:

cvSaveImage("/Users/nicc/image.jpg",img);


En mi experiencia, OpenCV escribe una imagen en negro cuando a SaveImage se le asigna una matriz con una profundidad de bit diferente de 8 bits. De hecho, esto está más o menos documentado:

Solo se pueden guardar imágenes de 8 bits de un solo canal o 3 canales (con orden de canal BGR) usando esta función. Si el formato, la profundidad o el orden de los canales es diferente, utilice cvCvtScale y cvCvtColor para convertirlos antes de guardarlos, o utilice universal cvSave para guardar la imagen en formato XML o YAML.

En su caso, primero puede investigar qué tipo de imagen se captura, cambiar las propiedades de captura (supongo que CV_CAP_PROP_CONVERT_RGB podría ser importante) o convertirla manualmente después.

Este es un ejemplo de cómo convertir a una representación de 8 bits con OpenCV. cc aquí hay una matriz original de tipo CV_32FC1 , cc8u es su versión escalada que en realidad está escrita por SaveImage :

# I want to save cc here cc8u = CreateMat(cc.rows, cc.cols, CV_8U) ccmin,ccmax,minij,maxij = MinMaxLoc(cc) ccscale, ccshift = 255.0/(ccmax-ccmin), -ccmin CvtScale(cc, cc8u, ccscale, ccshift) SaveImage("cc.png", cc8u)

(Lo siento, este es el código de Python, pero debería ser fácil traducirlo a C / C ++)


Le sugiero que ejecute el control de cordura OpenCV

Es una serie de pequeños ejecutables ubicados en el directorio bin de opencv.

Verificará si tu cámara está bien


Perdón por abrir una publicación anterior, pero quería proporcionar otra respuesta para cualquier persona que encuentre este hilo.

Yo tuve el mismo problema. No importa lo que hice, la imagen parecía que estaba completamente negra. Traté de realizar múltiples llamadas consecutivas a cvQueryFrame y me di cuenta de que cuando obtuve 5 o más, pude ver la imagen. Así que comencé a eliminar las llamadas una a una para ver dónde estaba el "punto de ruptura". Lo que terminé encontrando fue que la imagen se oscureció y oscureció a medida que eliminaba cada llamada. Hacer solo una llamada proporcionó una imagen que era casi completamente negra, pero si miraba de cerca, podía distinguir mi imagen.

Probé 10 llamadas consecutivas para probar mi teoría, y efectivamente, obtuve una imagen muy brillante, considerando que estoy en una habitación con poca luz. Con suerte, este fue el mismo problema que te encontraste.

No sé mucho sobre imágenes, pero parece que múltiples llamadas consecutivas a cvQueryFrame aumentan la duración de la exposición de la cámara. Esto definitivamente soluciona el problema, aunque no parece ser la solución más elegante. Voy a ver si puedo encontrar un parámetro que aumente la exposición, o quizás algún otro parámetro que aclare mis imágenes.

¡Buena suerte!


Sé el problema! ¡Acabas de poner un punto después de "test.jpg"!

cvSaveImage ("test.jpg"., pSaveImg);

¡Puedo estar equivocado, pero creo que no es bueno!


SayntLewis tiene razón. Cuando activa la cámara con cvCaptureFromCAM, el balance de blancos automático aún no está ajustado (es un proceso lento), por lo que puede obtener un blanco en su mayoría o negro (depende de la cámara y las condiciones de iluminación) en los primeros cuadros. Lo mismo ocurre cuando hay un cambio repentino del rayo de la escena. Espere un momento después de abrir la cámara, descargue el buffer y ya está listo para comenzar.


Si usa C ++, es mejor usar la interfaz C ++ :

using namespace cv; // Capture the Image from the webcam VideoCapture cap(0); // Get the frame Mat save_img; cap >> save_img; if(save_img.empty()) { std::cerr << "Something is wrong with the webcam, could not get frame." << std::endl; } // Save the frame into a file imwrite("test.jpg", save_img); // A JPG FILE IS BEING SAVED


Tuve el mismo problema en Windows Vista, acabo de agregar este código antes de cvQueryFrame :

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 720); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);


Tuve un problema similar con mi Microsoft WebCam. Busqué en la caja de herramientas de adquisición de imágenes en Matlab y encontré que la resolución máxima admitida es 640 * 480.

Acabo de cambiar el código en openCV y agregué

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 352); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 288);

antes de la función cvQueryFrame, que era la siguiente resolución admitida, y se cambió omitiendo algunos fotogramas iniciales antes de guardar la imagen y finalmente la puso en funcionamiento.

Estoy compartiendo mi código de trabajo

#include "cv.h" #include "highgui.h" #include <stdio.h> using namespace cv; using namespace std; int main() { CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY ); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 352); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 288) // Get one frame IplImage* frame; for (int i = 0; i < 25; i++) { frame = cvQueryFrame( capture ); } printf( "Image captured /n" ); //IplImage* RGB_frame = frame; //cvCvtColor(frame,RGB_frame,CV_YCrCb2BGR); //cvWaitKey(1000); cvSaveImage("test.jpg" ,frame); //cvSaveImage("cam.jpg" ,RGB_frame); printf( "Image Saved /n" ); //cvWaitKey(10); // Release the capture device housekeeping cvReleaseCapture( &capture ); //cvDestroyWindow( "mywindow" ); return 0; }

Mis sugerencias:

  1. No agarre el marco con la resolución máxima
  2. Omita algunos cuadros para una correcta inicialización de la cámara

Uso el siguiente código para capturar imágenes:

CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY ); if(!capture) error((char*)"No Capture"); IplImage *img=cvQueryFrame(capture);

Sé que esto funciona con certeza


con suerte, esto guardará las imágenes de su cámara web

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() { VideoCapture cap(0); Mat save_img; cap >> save_img; char Esc = 0; while (Esc != 27 && cap.isOpened()) { bool Frame = cap.read(save_img); if (!Frame || save_img.empty()) { cout << "error: frame not read from webcam/n"; break; } namedWindow("save_img", CV_WINDOW_NORMAL); imshow("imgOriginal", save_img); Esc = waitKey(1); } imwrite("test.jpg",save_img); }


lo siento si esto es demasiado obvio. ¿Estás seguro de que la cámara web es vista y detectada correctamente por OpenCV? En otras palabras, ¿obtienes una imagen cuando redirige el cuadro capturado a una ventana "highGui"? Por ejemplo, así:

frame = cvQueryFrame( capture ); cvNamedWindow( "myWindow", CV_WINDOW_AUTOSIZE ); cvShowImage( "myWindow", frame );