2010-06-25 3 views
2

저는 프로그래밍에 새로운 것이므로 OpenCV를 사용하여 웹캠에서 이미지를 캡처하고 이미지를 pgm 파일로 저장해야하는 프로젝트를 진행하고 있습니다.OpenCV에서 이미지를 캡처하고 pgm 형식으로 저장하려면 어떻게합니까?

가장 간단한 방법은 무엇입니까? 나는 그것을 수정하는 방법,

http://opencv.willowgarage.com/wiki/CameraCapture

의 거점으로이 코드를 사용 : 윌로우 이미지 캡처에 대한이 코드를 제공하는 라이브 캠에서

  1. 캡처 이미지를 2 초마다
  2. 이미지를 pgm 형식의 폴더에 저장하십시오.

제공 할 수있는 도움에 감사드립니다.

답변

-1

나는 형식이 파일 이름의 확장자에서 선택하고 있다고 생각 - 그래서 당신의 OpenCV의 lib 디렉토리에의 당신이 뭔가를 할 수있는 적절한 libs와에 링크되어 가정 :

(.이 정확하지 않을 수 있습니다 메모리에서입니다)
CvCapture* capture = cvCaptureFromCam(0); 
IplImage* frame = cvQueryFrame(capture); 
while (1) { 
    frame = cvQueryFrame(capture); 
    cvSaveImage("foo.pgm", &frame); 
    sleep(2); 
} 
cvReleaseImage(&frame); 
cvReleaseCapture(&capture); 
-1

당신은 단순히 잠을 넣어 superaccurate 이초이 필요하지 않은 경우 (2) 각 잡아 전에 이리저리 이초을 대기하는 동안 (1) 루프에서 수면 (2000), cvSaveImage와

쓰기 이미지() 파일명에 확장자 .pgm을 넣으면 pgm이 사용됩니다.

5

먼저 새로운 사이트 - opencv.org을 사용하십시오. 구식 참조를 사용하면 새 사용자가 이전 참조를보고 오래된 문서를 읽고 이전 링크를 다시 게시 할 때 체인 효과가 발생합니다.

이전 C API를 사용할 이유가 없습니다. 대신, 새로운 C++ 인터페이스를 사용할 수 있습니다.이 인터페이스는 비디오 캡처 기능을 정상적으로 처리합니다. 여기 VideoCapture에 문서에서 예제의 버전을 단축 : 당신이 프로그래밍에 새로운 경우

#include "opencv2/opencv.hpp" 

using namespace cv; 

int main(int, char**) 
{ 
    VideoCapture cap(0); // open the default camera 
    if(!cap.isOpened()) // check if we succeeded 
     return -1; 

    for(;;) 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera 
     // do any processing 
     imwrite("path/to/image.png", frame); 
     if(waitKey(30) >= 0) break; // you can increase delay to 2 seconds here 
    } 
    // the camera will be deinitialized automatically in VideoCapture destructor 
    return 0; 
} 

또한, OpenCV의에 파이썬 인터페이스 사용을 고려 - CV2 모듈을. 파이썬은 종종 C++보다 단순한 것으로 간주되며, 대화 형 콘솔에서 바로 OpenCV 기능을 사용할 수 있습니다.

import numpy as np 
import cv2 

cap = cv2.VideoCapture(0) 

while(True): 
    # Capture frame-by-frame 
    ret, frame = cap.read() 
    # do what you want with frame 
    # and then save to file 
    cv2.imwrite('path/to/image.png', frame) 
    if cv2.waitKey(30) & 0xFF == ord('q'): # you can increase delay to 2 seconds here 
     break 

# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 
2

ffriend의 대답은 부분적으로 만 사실이기 때문에, 내가 (C++에서) 여기에 좀 더 추가 할 것입니다 : cv2와 비디오 캡처이 (here에서 채택 된 코드) 같은 것을 보인다. 이 질문의 저자는 PNG가 아닌 PGM (각 픽셀을 8 비트로 저장하는 PXM 파일 형식)으로 내보내도록 요청합니다 (친구가 회신함에 설명 함). 여기에 주요 문제는 official documentation for imwrite이 omho 모두이 문제에 대해 명확하지 않은 경우입니다 :

PPM, PGM, 또는 PBM를 들어

, 그것은 바이너리 형식 플래그 (CV_IMWRITE_PXM_BINARY)가 될 수 0 또는 1 기본 값은 1입니다

일반 영어로 문장을 읽는 경우, CV_IMWRITE_PXM_BINARY, 0 또는 1의 옵션 목록이 있습니다. 그 (것)들이 실제로 결합 될다는 것을 언급은 없다!나는 (나는 또한 내 프로젝트에 대한 8 비트 이미지를 저장하는 데 필요한) 약간의 실험을했고 마침내 원하는 솔루션에 도착 :

내 조사는 어쩌면 저자가 있었다 this 질문 (연료로했다
std::vector<int> compression_params; // Stores the compression parameters 

compression_params.push_back(CV_IMWRITE_PXM_BINARY); // Set to PXM compression 
compression_params.push_back(0); // Set type of PXM in our case PGM 
const std::string imageFilename = "myPGM.pgm"; // Some file name - C++ requires an std::string 

cv::imwrite(imageFilename, myImageMatrix, compression_params); // Write matrix to file 

여전히 똑같은 문제와 PXM 형식에 대한 기본 정보로 어려움을 겪고 있습니다. PXM 형식은 here입니다. 바로이 경우에 요구되는 것이다

P2 
32 100 
255 
121 237 26 102 88 143 67 224 160 164 238 8 119 195 138 16 176 244 72 106 72 211 168 45 250 161 37 1 96 130 74 8 
126 122 227 86 106 120 102 150 185 218 164 232 111 230 207 191 39 222 236 78 137 71 174 96 146 122 117 175 34 245 6 125 
124 121 241 67 225 203 118 209 227 168 175 40 90 19 197 190 40 254 68 90 88 242 136 32 123 201 37 35 99 179 198 163 
97 161 129 35 48 140 234 237 98 73 105 77 211 234 88 176 152 12 68 93 159 184 238 5 172 252 38 68 200 130 194 216 
160 188 21 53 16 79 71 54 124 234 34 92 246 49 0 17 145 102 72 42 105 252 81 63 161 146 81 16 72 104 66 41 
189 100 252 37 13 91 71 40 123 246 33 157 67 96 71 59 17 196 96 110 109 116 253 30 42 203 69 53 97 188 90 68 
101 36 84 5 41 59 80 8 107 160 168 9 194 8 71 55 152 132 232 102 12 96 213 24 134 208 1 55 64 43 74 22 
92 77 30 44 139 96 70 152 160 146 142 8 87 243 11 91 49 196 104 250 72 67 159 44 240 225 69 29 34 115 42 2 
109 176 145 90 137 172 65 25 162 57 169 92 214 211 72 94 149 20 104 56 27 67 218 17 203 182 5 124 138 2 130 48 
121 225 25 106 89 76 69 189 34 25 173 8 114 83 72 52 145 154 64 40 91 2 251 53 251 237 20 124 82 2 194 42 ... 

:

결과 (화상의 일부분)는 아래에 표시된다. 상단에 "P2"표시가 있으며 값은 0에서 255까지 명확하게 표시되며 픽셀 당 정확히 8 비트입니다.

+0

어떻게하면 PPM 이미지로 저장할 수 있습니까? 두 번째 int 배열에 밀어 넣은 내용에 대한 설명서를 찾으려면 나타납니다. –

+0

설명서에서 언급 한 매개 변수의 조합을 사용해보십시오. 그 외에도 OpenCV를 사용하여 솔루션을 찾을 수있는 유일한 방법은 OpenCV 소스 코드를 직접 보는 것입니다. 그러나 실제로는 그렇게까지 가지 않는 것이 좋습니다. 자신 만의 imwrite() 버전을 작성하여 소스 코드에 포함시킬 수도 있습니다. PGM은 꽤 솔직하며 필요한 경우 PPM 내보내기 기능을 작성하는 것이 어렵지 않을 것이라고 생각합니다. 파일 확장자는 OpenCV에서 중요합니다. – rbaleksandar

관련 문제