引言:
大一寒假放的时间挺长的,在家空着便想着搞点什么软件玩玩,想到前不久学的点图像处理基础知识,便想将它们整合一下,弄个实在的东西,于是便想起了这个。我就先仅涉及一下它的棋子识别的代码的matlab仿真,也算一时兴起了吧
总体思路:
由摄像头定期对棋盘进行拍摄,将拍摄的照片传给matlab,matlab将这次拍摄的照片与上次拍摄的照片进行图像相减运算,得到一个新图像,如果这个新图像的所有像素点求和小于一个值,则说明两张图差不多,因而可以说棋盘上没有下新棋,继续上述过程;反之则对新图像进行图像处理,运用hough圆检测找该棋子,并通过hough直线检测找到棋盘的横纵线,由此判断出该棋子在第几行,第几列,从而判断出棋子位置。
matlab代码实现:
1:首先我们要有一个摄像头,将采集的图像数据每隔一定时间及时传送给matlab:
步骤:
A:将摄像头与电脑usb连接并下载驱动程序
B:用matlab查看本机连有的摄像头,输入命令imaqhwinfo,显示结果为:
InstalledAdaptors: {'gentl' 'gige' 'matrox' 'winvideo'}
MATLABVersion: '8.6 (R2015b)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '4.10 (R2015b)'
C:查看’winvideo’摄像头的id号,输入命令imaqhwinfo( ‘winvideo’ ),显示结果为:
AdaptorDllName: 'D:\matlab\matlab\osgenericvideointerface\toolbox\imaq\supportpackages\genericvideo\…'
AdaptorDllVersion: '4.10 (R2015b)'
AdaptorName: 'winvideo'
DeviceIDs: {[1]}
D:每隔3秒读取摄像头图像:
clear;
vid = videoinput('winvideo',1);%通过videoinput()创建视频输入对象
preview(vid);%显示所创建的视频对象
start(vid);%开始vid视频输入对象定时
h=figure('NumberTitle','off','Name','视频',...
'MenuBar','none','color','c',...
'Position', [0, 0, 1, 1], 'Visible', 'on'); %新建读取的图像窗口
while ishandle(h)%判断是否有效的图像对象句柄
frame1=getsnapshot (vid); % 捕获前一张图像
flushdata(vid);%清除数据获取引擎的所有数据、置属性SamplesAvailable为0
imshow(a);
pause(3);%等3秒后获取下一张图片
frame2=getsnapshot (vid);% 捕获后一张图像
flushdata(vid);
end;
2:接着对图像进行减运算,判断是否有新棋子出现(假设对方是白棋):
frame=imsubtract(frame2,frame1);%图像相减
frame=im2bw(frame,220/255);%设定阈值,将白棋找出,去掉黑棋
num=sum(sum(frame),2);%求相减新图像的像素点之和
if num>1000%有新白棋出现
h=[-1 -1 -1;-1 8 -1;-1 -1 -1];%拉普拉斯卷积核
frame=imfiter(frame,h);%提取黑棋的边界
end
3