簡體   English   中英

使用C ++對視頻進行OpenCV Canny Edge檢測

[英]OpenCV Canny Edge detection of a video in C++

我正在從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函數中給出錯誤,我無法修復。 誰能幫忙嗎?

您對函數指針的初始化是錯誤的。 您需要將函數的引用傳遞給指針進程

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

順便說一句,問題與標題無關。 我建議更改標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM