3

みなさん、良い一日を!現在、私はビデオ処理のプロジェクトに取り組んでいるので、OpenCV を試してみることにしました。私はそれに慣れていないので、いくつかのサンプル コードを見つけてテストすることにしました。最初のものは C OpenCV で、次のようになります。

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <stdio.h>

int main( void ) {

CvCapture* capture = 0;
IplImage *frame = 0;

    if (!(capture = cvCaptureFromCAM(0)))
    printf("Cannot initialize camera\n");

cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);

while (1) {

    frame = cvQueryFrame(capture);
    if (!frame)
        break;

    IplImage *temp = cvCreateImage(cvSize(frame->width/2, frame->height/2), frame->depth, frame->nChannels); // A new Image half size

    cvResize(frame, temp, CV_INTER_CUBIC); // Resize
    cvSaveImage("test.jpg", temp, 0); // Save this image
    cvShowImage("Capture", frame); // Display the frame
    cvReleaseImage(&temp);
    if (cvWaitKey(5000) == 27) // Escape key and wait, 5 sec per capture
        break;
}

cvReleaseImage(&frame);
cvReleaseCapture(&capture);

return 0;

}

したがって、これは完全にうまく機能し、イメージをハードドライブにうまく保存します。しかし、問題は C++ OpenCV を使用する次のサンプルから始まります。

#include "opencv2/opencv.hpp"
#include <string>

using namespace cv;

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

    Mat edges;
    //namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_RGB2XYZ);
        imshow("edges", edges);
    //imshow("edges2", frame);
    //imwrite("test1.jpg", frame);
        if(waitKey(1000) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

ええ、一般的に、ビデオ (画像フレーム) を表示するという点では実質的に変更はありませんが、im* *関数を使用する場合、いくつかの問題が発生します。

cvSaveImage()を使用すると問題なく動作しますが、 imwrite()を使用しようとすると、「アクセス違反の読み取り場所」に関して未処理の例外が発生します。画像を読み込もうとしているときは、 imread()にも同じことが言えます。

そこでお聞きしたいのですが、ほとんどの機能は C OpenCV で使用できますか? または、C++ OpenCV を使用する必要がありますか。はいの場合、先ほど説明した問題の解決策はありますか。


また、ここで述べたように、画像は最初は BGR 形式であるため、変換が必要です。しかし、BGR2XYZ 変換を行うと色が反転するように見えますが、RGB2XYZ は色を保持します。例:

画像

4

1 に答える 1

2

または、C++ OpenCV を使用する必要がありますか?

いいえ、必要性は一切ありません。好きなインターフェイスを使用でき、それが得意だと思います (OpenCV は C、C++、Python インターフェイスを提供します)。

imwrite()とに関する問題についてimread():

カラー画像の場合、順序チャネルは通常 Blue、Green、Red であり、これは imshow() 、 imread() および imwrite() が期待するものです

そこから引用

于 2012-09-16T10:20:21.607 に答える