计算机学习笔记5.
内部⽂件
本周⼯作记录
2015.8.10——2015.8.14
<;智慧云联信息技术(北京)有限公司>
版本
编制者王琳珂编制⽇期2015-08-14 审核者审核⽇期
批准者批准⽇期
签字⽇期
2015年08⽉14⽇
⽬录
1. 海康摄像头视频⾃动抓图 (3)
1.1 开启预览之后⾃动保存每帧图⽚为BMP格式 (4)
1.2 不预览情况下⾃动保存图⽚ (5)
1.3 编写代码查看保存⼀张图⽚所⽤时间 (7)
2. WIN7系统下搭建LINUX虚拟机 (9)
2.1 ⼯具 (9)
2.2 安装VMware (9)
2.3 搭建LINUX虚拟机 (12)
2.4 安装后的基本设置 (17)
3. 批处理删除VS⼯程下的中间⽂件 (19)
4. Ubuntu中利⽤gcc和gdb编译和调试程序 (23)
4.1 单个C源⽂件的编译(参数-o) (23)
4.2 多个C源⽂件的编译(参数-c和-o) (23)
4.3 利⽤gdb调试程序 (25)
1. 海康摄像头视频⾃动抓图
各个函数初始代码:
函数: InitInstance(HINSTANCE, int)
请输入长度介于05之间的字符串BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
//前⾯的原代码不变,后⾯加⼊如下摄像头初始化设置
//---------------------------------------
hDC = GetWindowDC(hWnd);
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
// 注册设备
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin",
"zhylxxjs201412", &struDeviceInfo);
if (lUserID < 0)
{
//在窗⼝上输出错误提⽰
TextOut(hDC,200,200,_T("Login error"),11);
//通过变量error查看错误信息
int error=NET_DVR_GetLastError();
return FALSE;
}
return TRUE;
}
开启预览函数:RealPlay()
void RealPlay()
{
//启动预览并设置回调数据流
NET_DVR_PREVIEWINFO struPlayInfo = {0};
struPlayInfo.hPlayWnd = hWnd; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空struPlayInfo.lChannel = 1; //预览通道号
struPlayInfo.dwStreamType = 0; //0-主码流,1-⼦码流,2-码流3,3-码流4,以此类推struPlayInfo.dwLinkMode = 0; //0- TCP⽅式,1- UDP⽅式,2- 多播⽅式,3-
RTP⽅式,4-RTP/RTSP,5-RSTP/HTTP
lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL);
if (lRealPlayHandle < 0)
{
TextOut(hDC, 200, 200, _T("NET_DVR_RealPlay_V40 error"),26);
int i=NET_DVR_GetLastError();
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return ;
}
}
关闭预览函数:PlayEnd()
void PlayEnd()
{
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
//注销⽤户
NET_DVR_Logout(lUserID);
/
/释放SDK资源
NET_DVR_Cleanup();
}
1.1 开启预览之后⾃动保存每帧图⽚为BMP格式
NET_DVR_CapturePicture功能:预览时,单帧数据捕获并保存成图⽚。
BOOL NET_DVR_CapturePicture(
LONG lRealHandle,
char *sPicFileName
);
Parameters:
lRealHandle [in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值
sPicFileName [in] 保存图象的⽂件路径(包括⽂件名)。路径长度和操作系统有关,sdk不做限制,windows默认路径长度⼩于等于256字节(包括⽂件名在内)。
Return Values:
TRUE表⽰成功,FALSE表⽰失败。获取错误码调⽤NET_DVR_GetLastError
Remarks:
(1)在调⽤该接⼝之前可以调⽤NET_DVR_SetCapturePictureMode设置抓图模式,默认为BMP模式。如果抓图模式为BMP模式,抓取的是BMP图⽚,保存路径后缀应为.bmp,例如:sPicFileName="D:\\test.bmp";如果抓图模式为JPEG模式,抓取的是JPEG图⽚,保存路径后缀应为.jpg,例如:sPicFileName="D:\\test.jpg"。
(2)调⽤NET_DVR_CapturePicture进⾏抓图,要求在调⽤NET_DVR_RealPlay_V40等接⼝时传⼊⾮空的播放句柄(播放库解码显⽰),否则时接⼝会返回失败,调⽤次序错误。
在D盘新建⽂件夹Picture,⽤来保存开启视频后抓取的每⼀帧图⽚。其中的⼀个难点是,⾃动保存图⽚的时候每⼀张图⽚的名字是否可以⾃动创建。例如,
test1.bmp,test2.bmp,这⾥需要⽤到C++中的⼀些语法知识。
(1)int转string
(2)多个string之间的连接
(3)String转char *
此处需要注意string s; s.data()或者s.c_str()的类型是const char * RealPlay()函数中写⼊实现此功能的代码:
for(i=1;i!=0;i++)
{
stringstream strStream;
strStream<
string FileBMPName ="D:\\Picture\\test"+strStream.str();
FileBMPName += ".bmp"; //后缀名.bmp
//预览时,单帧数据捕获并保存成图⽚
NET_DVR_CapturePicture(lRealPlayHandle,(char *)FileBMPName.data());
Sleep(40);//执⾏挂起40ms,即1s截取25张图⽚,需要带上头⽂件windows.h
}
编译通过之后运⾏程序,点击菜单开启预览,此时每隔40ms保存⼀帧图⽚,保存结果如下:
1.2 不预览情况下⾃动保存图⽚
在⽂件菜单下添加“截图”,根据ID号将该菜单加到程序中以实现截图功能。
⾸先声明截图函数void CapturePicture();
分析菜单选择中添加截图的ID号:
case ID_32773:
CapturePicture();
break;
NET_DVR_CaptureJPEGPicture功能:单帧数据捕获并保存成JPEG图。BOOL NET_DVR_CaptureJPEGPicture( LONG lUserID,
LONG lChannel,
LPNET_DVR_JPEGPARA lpJpegPara,
char *sPicFileName
);
Parameters:
lUserID [in] NET_DVR_Login或NET_DVR_Login_V30的返回值
lChannel [in] 通道号
lpJpegPara [in] JPEG图像参数
sPicFileName [in] 保存JPEG图的⽂件路径(包括⽂件名)
Return Values:
TRUE表⽰成功,FALSE表⽰失败。获取错误码调⽤NET_DVR_GetLastError
截图函数:CapturePicture()
void CapturePicture()
{
for(i=1;i!=0;i++)
{
stringstream strStream;
strStream<
string FileJPEGName ="D:\\Picture\\test"+strStream.str();
FileJPEGName += ".jpg";
NET_DVR_JPEGPARA struJpegpara={0};
struJpegpara.wPicQuality=2; //图⽚质量系数:0-最好,1-较好,2-⼀般
struJpegpara.wPicSize=0;
NET_DVR_CaptureJPEGPicture(lUserID,1,&struJpegpara,(char *)FileJPEGName.data());//单帧数据捕获并保存成JPEG图}
}
从运⾏结果看出每秒钟只能抓取⼏张图⽚。
1.3 编写代码查看保存⼀张图⽚所⽤时间
因为在不预览情况下保存图⽚的效率很低,为了查看每帧图⽚的保存时间,我们添加相应的开始时间和结束时间函数,来计算程序运⾏时间。
#include
#include //关键
using namespace std;
int main()
{
clock_t start, finish;
double totalTime;
start = clock();
//需要测试运⾏时间的代码段放在这
finish = clock();
totalTime = (double)(finish - start);
cout<<"花费"<
return 0;
}
截图函数:CapturePicture()
void CapturePicture()
{
clock_t start,finish;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。