#include "opencv2/core.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/videoio/registry.hpp>
#include <string.h>
#include <iostream>
#include <thread>
#include "timetool.h"
//#define EN_OCL
using namespace std;
using namespace cv;
String windowTitle = "VGA Capture Demo";
void flush(VideoCapture& camera)
{
int delay = 0;
int framesWithDelayCount = 0;
while (1)
{
high_resolution_clock::time_point start_point = high_resolution_clock::now();
camera.grab();
auto dulation = high_resolution_clock::now() - start_point;
std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds> (dulation);
delay = ms.count();
std::cout << ms.count() << std::endl;
if(delay > 30)
{
std::cout << "buffer is empty!" << std::endl;
break;
} else {
std::cout << "buffer is not empty!" << std::endl;
}
}
}
int main(int argc, char** argv)
{
VideoCapture cap;
cap.open(0); //打开摄像头
if(!cap.isOpened())
{
cout << "Open Camera Failed!" << endl;
return -1;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::cout << "fps=" << cap.get(CAP_PROP_FPS) << std::endl;
cap.set(CAP_PROP_BUFFERSIZE, 3);
cap.set(CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
//cap.set(CAP_PROP_FOURCC, CAP_OPENCV_MJPEG); //次行设置无效,切记!!!使用下面的方式
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
cap.set(CAP_PROP_FOURCC, codec);
int fourcc = cap.get(CAP_PROP_FOURCC);
char tmp[5];
memset(tmp, 0, 5);
memcpy(tmp, &fourcc, 4);
std::cout << "fourcc=" <<tmp << std::endl;
cap.set(CAP_PROP_FPS, 30);
std::cout << "fps=" << cap.get(CAP_PROP_FPS) << std::endl;
#ifdef EN_OCL
ocl::setUseOpenCL(true);
UMat image;
#else
Mat image;
#endif
namedWindow(windowTitle, WINDOW_NORMAL);
moveWindow(windowTitle, 400, 300);
flush(cap);
bool endProgram = false;
while (!endProgram)
{
cap >> image;
imshow( windowTitle, image );
char c = (char)waitKey( 1 );
if ((c == 'q') | (c == 'Q') | (c == 27))
{
endProgram = true;
}
if ((c == 's') | (c == 'S'))
{
//save the picture
static int index = 0;
string image_name = to_string(index++) + ".png";
imwrite(image_name, image);
}
}
cap.release();
destroyAllWindows();
return 0;
}