2010-06-25 5 views
2

Я совершенно новый для программирования в целом, и я работаю над проектом, для которого мне нужно захватить изображения с моей веб-камеры (возможно, с помощью OpenCV) и сохранять изображения в виде файлов pgm.Как делать снимки в OpenCV и сохранять в формате pgm?

Каков самый простой способ сделать это? Willow Garage предоставляет этот код для захвата изображения:

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

Используя этот код в качестве основы, как я мог бы изменить его:

  1. захвата изображения с живой кулачком каждые 2 секунды
  2. сохранить изображения в папке в формате pgm

Большое спасибо за любую помощь, которую вы можете предоставить!

ответ

-1

Я считаю, что формат выбран из расширения имени файла - так предполагая, ваши OpenCV библитеков связаны с соответствующим 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

Если вам не нужно сверхточные 2seconds тогда просто поставить сон (2) или Sleep (2000) в то время как (1) цикл, чтобы ждать Фро 2seconds перед каждым захватом,

Запись изображения с cvSaveImage() просто поместите расширение .pgm на имя файла, и он будет использовать pgm.

5

Прежде всего, используйте новый сайт - opencv.org. Использование устаревших ссылок приводит к эффекту цепочки, когда новые пользователи видят старые ссылки, снова читают старые документы и публикуют старые ссылки.

На самом деле нет оснований использовать старый API C. Вместо этого вы можете использовать более новый интерфейс 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; 
} 

Кроме того, если вы новичок в программировании, следует использовать интерфейс Python для OpenCV - CV2 модуль. Python часто считается более простым, чем C++, и используя его, вы можете играть с функциями OpenCV прямо в интерактивной консоли. Захват видео с cv2 выглядит что-то вроде этого (принят код из here):

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++). Автор этого вопроса запрашивает явно для экспорта в PGM (формат файла PXM, который хранит каждый пиксель в 8 бит), а не PNG (как описывает его фьюджер). Основной проблемой здесь является то, что official documentation for imwrite является omho не ясно по этому вопросу на всех:

Для PPM, PGM или PBM, это может быть бинарный флаг формат (CV_IMWRITE_PXM_BINARY), 0 или 1. По умолчанию значение равно 1 .

Если мы читаем предложение в нормальном английском, у нас есть список опций: CV_IMWRITE_PXM_BINARY, 0 или 1. Нет никакого упоминания о том, что эти люди могут и на самом деле должны быть объединены!Я должен был немного поэкспериментировать (я также нужно хранить 8-битные изображения для моего проекта) и, наконец, получил искомое решение:

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 

Мое исследование также подпитывается this вопрос, где автор был (возможно все еще есть), борясь с той же проблемой, а также некоторой базовой информацией о формате 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