2

私はプログラミング全般にまったく慣れておらず、Webカメラから画像をキャプチャして(おそらくOpenCVを使用して)、画像をpgmファイルとして保存する必要があるプロジェクトに取り組んでいます。

これを行う最も簡単な方法は何ですか?ウィローガレージは、画像キャプチャ用に次のコードを提供しています。

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

このコードをベースとして使用して、次のように変更するにはどうすればよいですか。

  1. 2秒ごとにライブカメラから画像をキャプチャします
  2. 画像をpgm形式のフォルダに保存します

あなたが提供できるどんな助けにも感謝します!

4

5 に答える 5

7

まず、新しいサイト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モジュールへのPython インターフェイスの使用を検討してください。多くの場合、Python は C++ よりも単純であると考えられており、Python を使用すると、対話型コンソールで 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()
于 2013-12-25T01:14:01.790 に答える
4

ffriendの答えは部分的にしか当てはまらないので、さらに追加します(C++で)。この質問の作成者は、PNG ではなく PGM (各ピクセルを 8 ビットで格納する PXM ファイル形式) にエクスポートすることを明示的に求めています (ffriend が返信で説明しているように)。ここでの主な問題は、 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 ビットです。

于 2014-05-22T09:06:21.760 に答える
-1

形式はファイル名の拡張子から選択されると思います-したがって、opencv ライブラリが適切なライブラリに対してリンクされていると仮定すると、次のようなことができます: (これはメモリからのものであり、正しくない可能性があります。)

CvCapture* capture = cvCaptureFromCam(0);
IplImage* frame = cvQueryFrame(capture);
while (1) {
    frame = cvQueryFrame(capture);
    cvSaveImage("foo.pgm", &frame);
    sleep(2);
}
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
于 2010-06-25T04:30:25.867 に答える
-1

超正確な 2 秒が必要ない場合は、sleep(2) または Sleep(2000) を while(1) ループに入れて、各グラブの前に 2 秒待機します。

cvSaveImage() で画像を書き込むには、拡張子 .pgm をファイル名に付けるだけで、pgm が使用されます。

于 2010-06-25T04:30:56.873 に答える