Как мне захватывать изображения в OpenCV и сохранять в формате pgm? - PullRequest
2 голосов
/ 25 июня 2010

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

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

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 25 декабря 2013

Прежде всего, пожалуйста, используйте более новый сайт - 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;
}

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

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()
4 голосов
/ 22 мая 2014

Поскольку ответ ffriend только частично верен, я добавлю к нему еще немного (на C ++).Автор этого вопроса явно запрашивает экспорт в PGM (формат файла PXM, в котором каждый пиксель хранится в 8 битах), а не в PNG (как описывает друг в своем ответе).Основная проблема заключается в том, что официальная документация для imwrite вообще не совсем ясна по этому вопросу:

Для 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

Мое расследование также было спровоцировано этим вопрос, где автор (возможно, все еще) борется с той же самой проблемой, а также с некоторой базовой информацией о формате PXM, которую вы можете найти здесь .

Результат (толькочасть изображения) отображается ниже:

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 бит на пиксель.

1 голос
/ 12 августа 2018

Прочитайте большинство ответов, но ни один из них не сможет удовлетворить мою потребность. Это будет действовать как камера и может использоваться для нажатия на фотографии мы можем изменить условие if ("c") на цикл for, чтобы автоматически щелкать изображения после определенного интервала

   # -*- coding: utf-8 -*-
"""
Created on Sun Aug 12 12:29:05 2018

@author: CodersMine
"""


import cv2
"""
Run this if you are facing invalid images issue
cap.release()

"""
cap = cv2.VideoCapture(0)#0 is internal cam : 1 is external webcam
i=0 #to save all the clicked images
while(True):
    ret, frame = cap.read()
    cv2.imshow("imshow",frame)
    key=cv2.waitKey(30)
    if key==ord('q'):
        break
    if key==ord('c'):
        i+=1
        cv2.imshow("imshow2",frame)
        cv2.imwrite('C:/Users/codersmine/desktop/image'+str(i)+'.png', frame)
        print("Wrote Image")

# release the capture
cap.release()
cv2.destroyAllWindows()
0 голосов
/ 25 июня 2010

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

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

0 голосов
/ 25 июня 2010

Я полагаю, что формат выбирается из расширения имени файла - поэтому, предполагая, что ваши библиотеки opencv связаны с соответствующими библиотеками, вы можете сделать что-то вроде: (это из памяти, может быть не правильно).

CvCapture* capture = cvCaptureFromCam(0);
IplImage* frame = cvQueryFrame(capture);
while (1) {
    frame = cvQueryFrame(capture);
    cvSaveImage("foo.pgm", &frame);
    sleep(2);
}
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
...