我正在從OpenCV Cookbook中學習OpenCV。在那裏,他給出了視頻中Canny邊緣檢測的代碼。這是他給我的代碼,我曾嘗試過。OpenCV Canny邊緣檢測C++中的視頻
#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
功能的錯誤,我無法修復它。任何人都可以幫忙嗎?
如果你說錯誤是什麼,幫助就容易多了。 – molbdnilo
VideoProcessor中的'process'應該聲明爲函數指針,如void(* porcess)(Mat&,Mat&);'。並且在'run()'中用'(* process)(frame,output)調用它;' – luhb