半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2013-10-7
|
本帖最后由 周刊麻将Sunday 于 2016-8-22 18:40 编辑
书记那贴被关闭了,他的意思似乎是90年代的游戏卡是因为没有运动模糊而不是帧数低? 试验了一下。@tenco
如果不合适的话这贴也关了吧……
视频链接:https://pan.baidu.com/s/1i536ROT
内含三个视频。

简单的视频,黑色背景中黄色球体下落,速度为每毫秒0.1像素,大概因为图片简单,每秒33帧(30ms一帧)时不卡顿,一拍二时(60ms一帧)有明显卡顿现象。
30.avi是30ms每帧每秒生成的视频(但所有三个视频帧数都压缩成了30FPS,但是时间差不太多就这样吧),60.avi是一拍二的视频,60blur.avi是60.avi的有运动模糊版(30ms的运动模糊和原视频几乎完全相同)。
运动模糊的计算: 人眼按1/24秒残留时间计算,1000/24/10=4.166666,模糊尺度按4或者5计算(结果到8都差不多),因为是垂直运动,模糊矩阵是一个长度为4的列向量:
[0.25;
0.25;
0.25;
0.25]
代码(opencv)
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main(int argc, int ** argv)
{
IplImage* img = cvCreateImage(cvSize(500, 500), 8, 3); //原图
IplImage* img2 = cvCreateImage(cvSize(500, 500), 8, 3); //模糊图像
CvVideoWriter* video = NULL;
//video = cvCreateVideoWriter("60mo.avi", CV_FOURCC('X', 'V', 'I', 'D'), 30, cvSize(img2->width, img2->height)); //录视频用的
unsigned int count=20;
unsigned int zhen = 60; //每帧时间,30ms或者60ms
// Make colors
CvScalar yellow = CV_RGB(255, 255, 0);
CvScalar white = CV_RGB(255, 255, 255);
CvScalar red = CV_RGB(255, 0, 0);
float k[] = { 0.25, 0.25, 0.25, 0.25}; //模糊核
CvMat km = cvMat(4, 1, CV_32FC1, k);
while (1){
cvZero(img);
cvCircle(img,
cvPoint(img->width/2,
zhen*0.1*count),
4, yellow,-1);
//cvFilter2D(img,img,;
cvFilter2D(img, img2, &km, cvPoint(0,-1)); //和模糊核卷积
cvShowImage("show", img2);
count++;
if (zhen*0.1 * count > img2->height)
count = 0;
// cvWriteFrame(video, img2); //录视频用的,一拍二就两遍,否则就一遍
// cvWriteFrame(video, img2);
// Exit on esc key
if (cvWaitKey(zhen) == 27) //等待合适的时间
break;
}
cvWaitKey(0);
cvReleaseVideoWriter(&video);
cvReleaseImage(&img);/*释放图像*/
cvReleaseImage(&img2);
cvDestroyAllWindows();/*释放所有窗口*/
}
结论:看起来卡的主要原因还是低帧数,加入运动模糊之后有一点效果但是也还是远远不够
|
|