2013-10-18 46 views
1

我試圖在按某個鍵但不工作時從網絡攝像頭保存圖像。在這裏我附上我的代碼:按下某個鍵時保存圖像Python/Opencv

import cv 

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE) 
camera_index = 0 
capture = cv.CaptureFromCAM(camera_index) 
i=0 

def repeat(): 
global capture 
global camera_index 
frame = cv.QueryFrame(capture) 
cv.ShowImage("w1", frame) 
c = cv.WaitKey(25) 
if(c=="n"): 
    cv.SaveImage("f"+str(i)+".jpg",frame) 
    i=i+1 
while True: 
    repeat() 
+0

是不是創建文件或文件不好?在前者的情況下嘗試添加一個'print c',被按下!「之前如果看到你得到什麼! –

+0

好的就解決了。問題出在WaitKey上,但我改變了條件:c = cv.WaitKey(25) if(c!= - 1): cv.SaveImage(「f」+ str(i)+「。jpg」,框架) i = i + 1 – user2894507

+0

作爲回答添加記錄此。 –

回答

1

cv.WaitKey()不返回密鑰,但在超時時給出-1。

解決了:

import cv 

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE) 
camera_index = 0 
capture = cv.CaptureFromCAM(camera_index) 
i=0 

def repeat(): 
global capture 
global camera_index 
frame = cv.QueryFrame(capture) 
cv.ShowImage("w1", frame) 
c = cv.WaitKey(25) 
if (c != -1): 
    cv.SaveImage("f"+str(i)+".jpg",frame) 
    i=i+1 
while True: 
    repeat() 
0

您可以簡單地按'S',保存圖像。以下是C++中的示例。

難道只是這樣

char ch = cvWaitKey(25); // Wait for 25 ms for user to hit any key 

    // Save image if s was keyboard 
    if(ch=='s') 
    { 
    cvSaveImage(path,small); 
    } 
    if(ch==27) break; // If Escape Key was hit just exit the loop 

希望這有助於。 :)

0

我有Opencv C++代碼,可以保存圖像時,任何鍵盤按鈕被按下。您可以將此opencv C++代碼轉換爲opencv python。

USAGE:

選項:

按1用於從CAM 1

捕獲按2用於從CAM捕獲2

按d爲從兩個CAM 1 & CAM 2

捕獲

按下a終止

這裏我使用兩個攝像頭,它具有FOV> 180度。因此,兩臺相機可以捕捉一個具有共同視野的圖案。或者你也可以從單個相機捕​​捉。

#include <opencv2/opencv.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <unistd.h> 


using namespace cv; 
using namespace std; 


int ct = 0; 
char key; 
char filename[100]; 
int c = 1; 
char filename1[100]; 
int d = 1; 

int main(int, char**) 
{ 


    Mat frame,frame1; 
    cout <<"USAGE:\n" 
      "Options:\n" 
      "Press 1 for capturing from CAM 1\n" 
      "Press 2 for capturing from CAM 2\n" 
      "Press d for capturing from both CAM 1 & CAM 2\n" 
      "Press a for Termination"<<endl; 

    //--- INITIALIZE VIDEOCAPTURE 
    VideoCapture cap(0); 
    VideoCapture cap1(1); 
// cap.set(CAP_PROP_FRAME_WIDTH,1024); 
// cap.set(CAP_PROP_FRAME_HEIGHT,768); 
// cap1.set(CAP_PROP_FRAME_WIDTH,1024); 
// cap1.set(CAP_PROP_FRAME_HEIGHT,768); 


    while(true) 
    { 

     cap >> frame; 
     cap1 >> frame1; 

     double cam_1 =cap.get(CV_CAP_PROP_POS_MSEC); 
     double cam_2 =cap.get(CV_CAP_PROP_POS_MSEC); 

     if (frame.empty()||frame1.empty()) { 
      cerr << "ERROR! blank frame grabbed\n"; 
      break; 
     } 

     usleep(5); 
     imshow("CAMERA 1", frame); 
     imshow("CAMERA 2", frame1); 

     tipka = cv::waitKey(30); 

     if (key == 'd')   //CAPTURING IMAGE FROM TWO CAMERA AT A SAME TIME 
     { 
      sprintf(filename, "/home/user/capture_imgs/Two_cam/0-%d.jpg", c); 
      sprintf(filename1, "/home/user/capture_imgs/Two_cam/1-%d.jpg", d); 

      //   imshow("CAMERA 1", frame); 
      //   imshow("CAMERA 2", frame1); 
      imwrite(filename, frame); 
      imwrite(filename1, frame1); 
      cout << "Cam 1 image captured = " << c << endl; 
      cout << "Cam 2 image captured = " << d << endl; 
      c++; 
      d++; 
     } 
     if(key == '1')  //CAPTURING IMAGE FROM CAM 1 
     { 
      sprintf(filename, "/home/user/capture_imgs/CAM_1/0-%d.jpg", c); 
      //   imshow("CAMERA 1", frame); 
      imwrite(filename, frame); 
      cout << "Cam 1 image captured = " << c << endl; 
      c++; 
     } 
     if(key == '2')  //CAPTURING IMAGE FROM CAM 2 
     { 
      sprintf(filename1, "/home/user/capture_imgs/CAM_2/1-%d.jpg", d); 
      //   imshow("CAMERA 2", frame1); 
      imwrite(filename1, frame1); 
      cout << "Cam 2 image captured = " << d << endl; 
      d++; 

     } 
     if (key == 'a') 
     { 
      cout << "Terminated..." << endl; 
      usleep(1000); 
      break; 
     } 
    } 
    return 0; 
}