最近测试了一下opencv自带的函数读取高清摄像头,究竟能不能做到实时读取?我先是百度了一下,网上很多读取1080p的例子,好像是可以。所以用单位的摄像头做了一个测试,结果如下:
1 opencv读取1920*1080的视频流。帧率只能达到 7.3帧/s
2 用DShow显示的话,帧率可以达到15帧/s
测试用的是同一个摄像头,不知道和摄像头有没有关系。
此次测试结果和我预想的有点差距,我感觉opencv应该可以做到实时读取1080P的视频流。在此先记录一下,如果测试过程有误请指正。
代码如下:
videoCapture读取:
void CMFCDShowDlg::OnBnClickedButopen2()
{
VideoCapture capture;
capture.open(0);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CAP_PROP_FRAME_HEIGHT, 1080);
Mat frame0;
Mat gray;
int nframe = 0;
float fps;
DWORD time2;
DWORD time1 = GetTickCount();
while (1)
{
capture.read(frame0);
cvtColor(frame0, gray, CV_RGB2GRAY);
nframe++;
time2 = GetTickCount();
double seconds = (time2 - time1) / 1000.0;
fps = nframe / seconds;
TRACE("Estimated frames per second : %f /s \r\n", fps);
imwrite("f://img//ds1.jpg", gray);
//显示
cv::imshow("camera", gray);
if (cvWaitKey(20) == 27)
break;
}
frame0.release();
gray.release();
}
DShow读取:
void CMFCDShowDlg::OnBnClickedButton1()
{
if (m_cameranum == 0)
return;
CCameraDS camera;
//打开第一个摄像头 //弹出属性选择窗口
if (!camera.OpenCamera(0, true))
{
fprintf(stderr, "Can not open camera.\n");
return;
}
//if (!camera.OpenCamera(0, false, 640, 480)) //不弹出属性选择窗口,用代码制定图像宽和高
//{
//fprintf(stderr, "Can not open camera.\n");
//return;
//}
int tt = 0, ltt = 0;
cv::namedWindow("camera");
int et = -13;
int nframe = 0;
float fps;
DWORD time2;
DWORD time1 = GetTickCount();
while (1)
{
//camera.SetExposure(et);
//获取一帧
IplImage *pFrame = camera.QueryFrame();
//std::cout<<"size = "<<pFrame->imageSize<<std::endl;
cv::Mat frame(1080, 1920, CV_8UC3, pFrame->imageData);
cv::Mat grey(1080, 1920, CV_8UC1);
cvtColor(frame, grey, CV_RGB2GRAY);
nframe++;
time2 = GetTickCount();
double seconds = (time2 - time1) / 1000.0;
fps = nframe / seconds;
TRACE("Estimated frames per second : %f /s \r\n", fps);
cv::flip(grey, grey, 1);
imwrite("f://img//ds0.jpg",grey);
//显示
cv::imshow("camera", grey);
et++;
if (cvWaitKey(2) == 27)
break;
}
camera.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
cvDestroyWindow("camera");
}