vector中存取数据的有关问题
vector中存取数据的问题
本人用opencv1.0实现一个视频帧读取的功能。定义了一个vector来储存视频中的帧,并将帧中的点(200,300)写到文档中,但是运行了后发现第一次输出和第二次输出的值不一样,第一次输出时正确的结果,第二次输出时全部是最后一个值。代码如下
结果如下:
(200,300):
0,109,107,107,105,
1.v_frame中点(200,300):
105,105,105,105,105,
各位大侠帮帮小弟,初学,不知何故
------解决方案--------------------
不过最后你得把v_frame中所有的CvMat*都release掉
本人用opencv1.0实现一个视频帧读取的功能。定义了一个vector来储存视频中的帧,并将帧中的点(200,300)写到文档中,但是运行了后发现第一次输出和第二次输出的值不一样,第一次输出时正确的结果,第二次输出时全部是最后一个值。代码如下
const int FrameNum = 5;//背景提取所需帧数
vector<CvMat*> v_frame;//存储每帧图像
vector<int> bgVal;//存储背景中各像素点灰度值数组
uchar backval = 0;//背景灰度值
if(!capture)
{
MessageBox("加载视频不成功");
}
else
{
int count=0;
int frameH=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);//视频帧高度
int frameW=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);//视频帧宽度
int fps=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS); //视频帧率
int numFrames=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);//视频帧数
CvMat* framemat=cvCreateMat(frameH,frameW,CV_8UC1); //当前帧矩阵
CvMat* bgmat=cvCreateMat(frameH,frameW,CV_8UC1); //背景帧矩阵
int num=0;//记录帧数
ofstream fout;
fout.open("F:\\deteDlg\\abcw.txt");
fout<<"(200,300):"<<"\n";
while (true)
{
frame=cvQueryFrame(capture);
if(!frame)
{
MessageBox("视频播放完毕");
break;
}
DrawPicToHDC(frame,IDC_CF);
if (num%3==0)
{
cvCvtColor(frame,framemat,CV_RGB2GRAY);
v_frame.push_back(framemat);
fout<<cvRound(cvGet2D(v_frame.at(num/3),200,300).val[0])<<",";//第一次输出
}
num++;
if (num==FrameNum*3)
{
break;
}
}
fout<<"\n";
fout<<"1.v_frame中点(200,300):\n";
for (vector<CvMat *>::size_type vtest=0;vtest<v_frame.size();vtest++)
{
fout<<cvRound(cvGet2D(v_frame.at(vtest),200,300).val[0])<<",";//第二次输出
}
fout<<"\n";
结果如下:
(200,300):
0,109,107,107,105,
1.v_frame中点(200,300):
105,105,105,105,105,
各位大侠帮帮小弟,初学,不知何故
vector
opencv
存储
------解决方案--------------------
if (num%3==0)
{
CvMat* framemat=cvCreateMat(frameH,frameW,CV_8UC1); //把这句移到这里来
cvCvtColor(frame,framemat,CV_RGB2GRAY);
v_frame.push_back(framemat);
fout<<cvRound(cvGet2D(v_frame.at(num/3),200,300).val[0])<<",";//第一次输出
}
不过最后你得把v_frame中所有的CvMat*都release掉