处理视频帧 - sumpig/OpenCV GitHub Wiki

videoProcessor.h

下面这段代码会在两个窗口中播放输入和输出图像,输出图像为输入图像的 Canny 边缘检测

#include "videoProcessor.h"

void canny(cv::Mat& img, cv::Mat& out) {

	if (img.channels() == 3)
		cv::cvtColor(img, out, cv::COLOR_BGR2GRAY);

	cv::Canny(out, out, 100, 200);

	cv::threshold(out, out, 128, 255, cv::THRESH_BINARY_INV);
}

int main() {

	VideoProcessor processor;
	processor.setInput("H:\\opencv_c++\\bike.avi");
	processor.displayInput("Current Frame");
	processor.displayOutput("Output Frame");
	processor.setDelay(1000. / processor.getFrameRate());
	processor.setFrameProcessor(canny);
	processor.run();

	return 0;
}

VideoProcessor 类实现的要点

  • 设置每一帧调用的回调函数
void setFrameProcessor(void (*frameProcessingCallback)) (cv::Mat&, cv::Mat&) {

  process = frameProcessingCallback;
}
  • 使用帧处理类代替帧处理函数
void setFrameProcessor(FrameProcessor* frameProcessorPtr) {

  // 使回调函数失效
  process = 0;
  
  frameProcessor = frameProcessorPtr;
}