2

OpenCVクックブックからOpenCVを学んでいます。その中で、彼はビデオで巧妙なエッジ検出のコードを提供しました。これは私が試した彼が与えたコードです。

#include "cv.h"
#include "highgui.h"
#include <string>
using namespace cv;
using namespace std;

void canny (Mat& img, Mat& out)
{
    // Convert image to gray
    if (img.channels () == 3)
    {
        cvtColor (img, out, CV_BGR2GRAY);
    }
    Canny (out, out, 100, 200);
    threshold (out, out, 128, 255, THRESH_BINARY_INV);
}

class VideoProcessor
{
    private:
        VideoCapture capture;
        bool callIt;
        void* process (Mat&, Mat&);
        string windowNameInput;
        string windowNameOutput;
        int delay;
        long fnumber;
        long frameToStop;
        bool stop;
    public:
        VideoProcessor () : callIt (true), delay (0), fnumber (0), stop (false), frameToStop (-1) {};
        int getFrameRate ()
        {
            return capture.get (CV_CAP_PROP_FPS);
        }
        void setFrameProcessor (void* frameProcessingCallback (Mat&, Mat&))
        {
            process = frameProcessingCallback;
        }
        bool setInput (string filename)
        {
            fnumber = 0;
            capture.release ();
            return capture.open (filename);
        }
        void displayInput (string wn)
        {
            windowNameInput = wn;
            namedWindow (windowNameInput);
        }
        void displayOutput (string wn)
        {
            windowNameOutput = wn;
            namedWindow (windowNameOutput);
        }
        void dontDisplay ()
        {
            destroyWindow (windowNameInput);
            destroyWindow (windowNameOutput);
            windowNameInput.clear ();
            windowNameOutput.clear ();
        }
        void run ()
        {
            Mat frame;
            Mat output;
            if (!isOpened ())
            {
                return;
            }
            stop = false;
            while (!isStopped ())
            {
                if (!readNextFrame (frame))
                {
                    break;
                }
                if (windowNameInput.length () != 0)
                {
                    imshow (windowNameInput, frame);
                }
                if (callIt)
                {
                    process (frame, output);
                    fnumber++;
                }
                else
                {
                    output = frame;
                }
                if (windowNameOutput.length () != 0)
                {
                    imshow (windowNameOutput, output);
                }
                if (delay >= 0 && waitKey (delay) >= 0)
                {
                    stopIt ();
                }
                if (frameToStop >= 0 && getFrameNumber () == frameToStop)
                {
                    stopIt ();
                }
            }
        }
        void stopIt ()
        {
            stop = true;
        }
        bool isStopped ()
        {
            return stop;
        }
        bool isOpened ()
        {
            capture.isOpened ();
        }
        void setDelay (int d)
        {
            delay = d;
        }
        bool readNextFrame (Mat& frame)
        {
            return capture.read (frame);
        }
        void callProcess ()
        {
            callIt = true;
        }
        void dontCallProcess ()
        {
            callIt = false;
        }
        void stopAtFrameNo (long frame)
        {
            frameToStop = frame;
        }
        long getFrameNumber ()
        {
            long fnum = static_cast <long> (capture.get (CV_CAP_PROP_POS_FRAMES));
            return fnum;
        }
};

int main ()
{
    VideoProcessor processor;
    processor.setInput ("video2.MOV");
    processor.displayInput ("Current Frame");
    processor.displayOutput ("Output Frame");
    processor.setDelay (1000 / processor.getFrameRate ());
    processor.process (, canny);
    processor.run ();
}

コンパイラがsetFrameProcessor関数でエラーを出しており、修正できません。誰でも助けてもらえますか?

4

1 に答える 1

2

関数ポインタの初期化が間違っています。関数の参照をポインタープロセスに渡す必要があります

void setFrameProcessor (void frameProcessingCallback (Mat&, Mat&))
{
   process = &frameProcessingCallback;
}

別の簡単な例:

#include <stdio.h>
void A()
{
printf("A");
}
void B(void A(void))
{
void (*f_ptr)(void);
f_ptr = &A;
f_ptr();
}
int main()
{
B(A);
return 0;
}

詳細については、以下のリンクを参照してください。

http://www.cprogramming.com/tutorial/function-pointers.html

ところで、質問はタイトルとは関係ありません。タイトルの変更を提案します。

于 2012-11-08T12:14:04.370 に答える