用opencv实现工控机的开机录像
需要训练一个神经网络模型,可能需要用到很多视频数据,所以我想把手头的工控机设置为上电自启动,再借助opencv编译一个可执行文件,放在windows开机启动文件夹里,这样只要连接好摄像头和工控机以及电源,一旦工控机通电,自动启动windows,随后自动调用录像,我只要定时去拷数据就可以了。
首先将工控机设置为开机自启动:
我用的工控机为研华工控机,参考这个文档将工控机设置为上电启动。做法:(1)开机按delete,进入BIOS系统;(2)左右选择到chipset>PCIH-IO…(3)将restore ac power loss改为“power on”;(4)保存设置并重启。
然后我在工控机上用VS编译了下面的代码:
1 #include <iostream> 2 #include <iomanip> 3 #include <sstream> 4 #include <string> 5 #include <opencv2/core/core.hpp> 6 #include <opencv2/imgproc/imgproc.hpp> 7 #include <opencv2/highgui/highgui.hpp> 8 9 10 using namespace cv; 11 using namespace std; 12 13 int main() 14 { 15 //open the camera 16 VideoCapture cap(0); 17 18 if(!cap.isOpened()){ 19 system("pause"); 20 return -1; 21 } 22 23 //设定帧率 24 double rate= 20.0; 25 cout << "Video rate: " << rate << "fps" << endl; 26 27 Mat frame; 28 cap>>frame; 29 imshow("Video",frame); 30 31 cout<<"Image size: "<<frame.size()<<endl; 32 33 string filename="Video"; 34 string extension=".avi"; 35 stringstream outputfile; 36 int digits=3; 37 38 //两分钟一个视频 39 int num_frame=(int)(rate*60*2); 40 41 //连续录三个 42 for(int i=0;i<3;) 43 { 44 outputfile.str(""); 45 outputfile<<filename<<setfill(\'0\')<<setw(digits)<<i++<<extension; 46 VideoWriter writer; 47 writer.open(outputfile.str(),CV_FOURCC(\'X\', \'V\', \'I\', \'D\'),rate,frame.size()); 48 49 bool stop(false); 50 int delay= 1000/rate; 51 int num=0; 52 53 while (!stop) 54 { 55 cap>>frame; 56 writer.write(frame); 57 imshow("Video",frame); 58 num++; 59 60 //达到指定帧数,停止录像 61 if(num>num_frame) 62 { 63 stop=true; 64 writer.release(); 65 cout<<"Save "<<outputfile.str()<<endl; 66 } 67 68 //按ESC退出录像 69 if(waitKey(delay)==27) 70 { 71 stop=true; 72 writer.release(); 73 cout<<"Save "<<outputfile.str()<<endl; 74 i=100; 75 } 76 77 } 78 } 79 80 81 cap.release(); 82 system("pause"); 83 return 1; 84 85 }
View Code
得到了.exe可执行文件,并将可执行文件放在了windows的启动文件下,这样就可以了。
windows7的启动文件在哪里