源代码:http://download.csdn.net/detail/bubifengyun/8980305
前几天收到任务,就是编写四相机轮胎检测操作界面程序。
一、首先是和甲方商谈要求,在今天上午(2012.08.06)进行,得出两张草图,据此编写界面。已经完成界面草稿,并计划使用有关模式。网上搜到一下资料,网址如下:
1、http://www.codeproject.com/search.aspx?q=usb&doctypeid=1%3b2%3b3
2、http://www.codeproject.com/Articles/18099/A-USB-HID-Component-for-C
3、http://www.codeproject.com/Articles/36976/Developing-a-USB-Storage-Device-Protection-Tool-wi
4、http://www.codeproject.com/Articles/132313/How-to-Debug-the-Windows-OS-using-USB
5、http://www.developerfusion.com/article/84338/making-usb-c-friendly/
6、http://www.eechina.com/thread-41820-1-1.html
7、http://wnkpbo2015.blog.sohu.com/179212764.html
8、http://www.cnblogs.com/mgod/archive/2008/06/18/1224351.html
可以参照这些资料,有些程序是遵循GPL原则的,注意不要违背。
二、2012.08.09
由于台风,一直在宿舍,也没有弄到资料,前几天就一无所获了,好好休息了一把。今天收到文档资料和相应的相机,白板等物质资料。该相机据说驱动只可以工作在window2000,window XP上,就直接用XP了。按照他们提供的资料,安装白板(用于扩展USB接口,每块4USB接口)两块,安装4个相机到白板上的USB接口(每个白板上两个相机),后插拔USB接口,弹出安装程序的对话框,试着安装驱动,完成相机的识别。相机被电脑识别也是尝试了很多次完成的,首先关闭了杀毒软件(不知道是否是必须的),开始的时候只有一个相机,后来两个,再后来出现四个相机,识别完成了。
接下来的工作是完成四个相机的预览工作,正在调试中,估计明天早上可以完成。
参考程序:http://www.codeproject.com/Articles/339340/MicroDVR-Simple-Video-Security-Using-Webcams
三、2012.08.13
昨天跟负责人碰头,结果却纠结于怎么识别四个相机,插插拔拔USB接口竟然用了一下午,不知道怎么想的。后来明确任务,购买两个5m USB延长线,更换新电脑。后来打开西安microvision的相机界面和北京catchBEST的相机界面,比较发现北京的相机画面不稳定,内有彩色的噪声点,像素不够小。得出结论采用西安的相机,我也是喜欢用西安的相机。因为北京的相机在C#下编程没有成功,我比较擅长C#,不擅长他们提供的VC++程序,西安的相机则是支持C#开发。唯一的缺点是西安的相机贵了。
定下来了我的时间安排,上午和周末全天完成这个程序,下午和晚上回去做本分的工作。现在回到阅读西安相机资料上面,终于确定使用什么相机、界面和语言了。总共二十天的时间,从2012.08.06算起,已经过去8天了,一直在磨蹭选择和资料上,一条语句还没有写。继续开始看资料,开始调试简单的程序。
四、2012.08.14
1、http://www.laomuji.com/jisuanjiyingyong/2012/0507/50403.html
2、http://www.codeproject.com/Articles/185522/Using-the-Raw-Input-API-to-Process-Joystick-Input
3、http://www.florian-leitner.de/index.php/2007/08/03/hid-usb-driver-library/
4、http://www.florian-leitner.de/index.php/projects/usb-hid-driver-library/
阅读以上网页,获知USB编程的大致方法,另外所有的硬件:新电脑、四台相机、USB延长线。接下来的事情是在6天内完成C#程序,期待好运。
五、2012.08.15
1、http://www.cnblogs.com/linbaoji/archive/2009/07/28/1533084.html为了获取硬件是否被拔出。下面的任务是得到有几个相机,然后确定各个相机的状态。对各个相机操作,则是明天的任务。
2、http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx 读取USB参数。
3、http://www.cnblogs.com/viki117/archive/2009/09/08/1562311.html
4、http://www.lvr.com/
六、2012.08.16
1、这个网址:http://blog.163.com/da7_1@126/blog/static/10407267820111214229111/ 使用C#获取USB设备(优盘)永久不变的物理序列号全部方案
八、2012.08.23
因为调戏一名女孩,耽误去两三天的时间,从昨天重新开始工作。昨天完成了相机设置部分,今天打算完成显示界面的友好化。明天完成相机的定时拍摄以及同电机的交联,控制电机转动。2012.08.25的交工,任务很重啊。
九、2012.08.28
程序被拖延了。推迟一周。加入了一个图片浏览器。这个东西是借鉴别人的。 http://www.codeproject.com/Articles/15373/A-scrollable-zoomable-and-scalable-picture-box 改编成的,这个做好后,回归开源。
十、2012.08.31
一直没有弄懂鼠标拖动画面的时候scrollbar是怎么动作的,参考此文。通过设置一个bool变量各一次记录上次的鼠标位置,从而实现随时更新移动scrollbar,相应程序参考:http://www.codeproject.com/Articles/319382/Creating-a-scrollable-and-zoomable-image-viewer-in
后来参考该程序http://www.codeproject.com/Articles/71225/Image-Viewer-UserControl,界面改动了一下。
十一、2012.09.01
1、http://www.codeproject.com/Articles/31547/Crystal-Image-Toolkit-thumbnail-image-control-and good code.
2、http://www.dotblogs.com.tw/atowngit/archive/2010/01/12/12972.aspx
下面是完成程序后部分说明。
一、本电脑的本程序只可以同时运行一个,不能运行多个。代码放在Program文件里面。具体代码如下:
static class Program { /// <summary> /// The main entry point for the application. /// </summary> private static Mutex mutex; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); mutex = new Mutex(true, "SJTU_TireTest"); if (mutex.WaitOne(0, false)) { Application.Run(new LoginWindow()); } else { MessageBox.Show("您已经打开了轮胎测试界面,\n不可以同时打开两个的。", "出错了!", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(0); } } }二、登录密码的保存
三、对于MainForm主界面的说明
内容比较庞杂,后续修改。
问题解决:
1、最后一次拍照黑暗的解决。
问题,该程序是每一轮拍摄6张照片,以开始这一轮的年月日时分秒为文件夹,存储照片。每次拍摄都要亮灯拍摄。却发现每次都是拍摄到第6次就随机出现黑色的照片了,找了好几周都没有解决问题。包括每一轮增加到拍摄第7次,第7次必然黑色照片。
寻找问题原因的思路:
第一反映是照相机坏了,仔细检测没有问题啊,相机还是可以继续拍摄。
第二反映内存不足,拍摄时候打开任务管理器,发现出现刚开始阶段,第六次不会黑色的。拍摄一段时间后开始一直出现第六张黑色照片。这个时候内存占用不足30%,CPU却高达90-100%,在CPU出现100%的尖峰时刻,就会出现第六张黑色照片。可以断定不是内存的原因,会不会是CPU太高了影响的?
第三反映CPU不够,要不要买个性能更好的电脑呢,答案显然不太现实。那就强制电脑出现CPU100%的情况,这个简单,用C#写了一个只有while(true);循环的语句,多开几个这样的程序,电脑就已经很卡了,任务管理器显示CPU100%,几乎就是一条直线了。这个时候出现问题了,第一张照片出现了一次黑色,第2-6次照片都是正常的,这是从来就没有过的现象。这就说明CPU100%不会影响相机拍摄的,100%CPU不是导致相机不工作拍摄黑色照片的原因。
第一张照片为什么出现黑色了呢?这个时候的解释太自然了,电脑太卡了,电灯和风扇都没有来得及打开,就拍摄了没有灯光的照片。啊?脑子突然想开了,第六次照片出现黑色是不是没有光线导致的黑色照片,急忙查看以前拍摄的照片,分析了一下那些照片——猛一看全黑,却是有点景象的,完全是黑暗无灯光的时候拍摄的结果。哦,原来是电脑太卡了,导致相机拍摄程序响应滞后,而灯光关闭程序被提前了,所以出现了拍摄关闭灯光后的景色。可以加时延暂时解决。如果电脑卡的非常厉害的话,估计时延也是没有用的。
2、拍摄重复的原因
由于拍摄重复,可以定位拍摄线程被多次调用了,用一个变量标记线程调用次数,发现确实是的,经过该代码作者的提醒,可能是由于写入之后的时延不足,导致的再次读出结果不对,造成的根据读出结果调用线程的重复时间,经过增大时延,问题解决。
3、相机很难识别的原因
使用四台相机,由于使用USB连接电脑,USB线过长,导致电源压降比较大,出现的现象就是电脑能识别到有四台相机,但是相机由于电压太低无法工作,电脑也就收不到图像。后来增加有源USB线,就能够轻松的显示图像了。另外一个例子,就是部分移动硬盘采用双USB接口,明显是为了提高输入电压的。