一、机器人相扑(2008微软创新杯机器人与算法初赛)
1、环境。
A、圆形擂台。
B、两个扁圆柱形机器人。
2、目标。
将对方机器人推出擂台。
3、机器人模块。
A、一个只能面向正前方的摄像头。
B、左右两个轮子。
4、信息获取。
A、根据摄像头传回图像中边界的弧度确定自己离边界的距离。
B、如果视野中存在对方机器人,根据近大远小来计算出对方机器人的位置,并确定其 姿态(正常还是翻倒)。
C、如果上一刻视野中也存在对方机器人,根据两个时刻对方机器人的位置来确定其行 进方向和速度。
5、战术选择。
A、简单粗暴:始终正对准对方机器人,持续对准后速度加到最大来将其撞翻或推出。
B、防御战术:原地高速转圈,对方过来时很容易被撞翻。
C、诱敌战术:在边界上以保持不出界的速度转圈,诱使敌方来撞自己时因速度太快而 出界。
D、避实就虚:发现对方正对着自己撞过来时,与对方运动方向成约135度夹角运动(保 持对方出现在己方摄像头的边界上),从而让对方和自己恰好错开。之后迅速转向 攻击对方的侧方或后方。
二、机器人火星探险(2008微软创新杯机器人与算法复赛)
1、环境。
A、火星环境模拟,四周是平地,中间是一个大坑,地表上有些大小不一的石头。
B、一个火星探测车。
2、目标。
A、移动到需要采集的石头旁边。
B、控制机器手臂将探针插入石头进行采集。
3、探测车模块。
A、前后共三个轮子。
B、车身摄像头和顶部摄像头。
4、信息获取。
A、将不同位置摄像头传回的图片进行对比,从而实现三维建模。
B、记录视野中各物体(石头、悬崖)的三维坐标。
5、行为模式。
A、根据目标的位置进行寻路,确定最优行进路线。
B、绕过前方的大石头;如果目标不在大坑里,绕过大坑。
C、到达目标点后,选取合适的位置,控制机器臂采集石头(这部分不是我写的,具体 情况完全不了解)。
D、如果要进入大坑,选取坡度最缓的地方下去。
三、实时脸谱
1、目标。
A、实时人脸位置识别(对速度和精度要求较高)。
B、在合适大小的脸谱来覆盖人脸,并将图片刷新。
2、方法。
A、识别皮肤和头发颜色,以确定大致范围。
B、脸部轮廓和五官识别,以确定精确位置和脸部姿态。
四、图像素描效果
1、方法(效果较粗糙,但程序实现较简练)。
A、用每个点与临近点的灰度值差距来构建新图像。
B、制造斜条纹效果。(就是感觉有斜条纹好看点)
2、代码。
publicvoid sumiao()
{
Bittemp1 = new Bitmap(src.Width, src.Height); //src为原图像
for (int x = 0; x < src.Width - 3; x++)
for (int y = 0; y < src.Height - 3; y++)
{
int Index = 0;
Color now=src.GetPixel(x, y);
sum=0;
t2 = (int)(now.R * 0.299 + now.G * 0.587 + now.B * 0.114);
//当前像素点的灰度值
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
//遍历邻近的像素点
{
Color temp = src.GetPixel(x + i, y + j);
t1 = (int)(temp.R * 0.299 + temp.G * 0.587 + temp.B * 0.114);
if (Math.Abs(t1-t2)>sum)
sum=Math.Abs(t1-t2);
//获取当前像素点与邻近像素点灰度值之差的最大值
Index++;
}
sum*=5/2;
if ((x+y)%3==0)
sum+=(100-t2)*2/3;
//制造斜条纹效果
sum=sum>150? 150:sum;
sum=sum<0? 0:sum;
//维护边界
Bittemp1.SetPixel(x, y,Color.FromArgb(255-sum, 255-sum, 255-sum));
//修改新图像
}
pictureBox1.Image = Bittemp1;
//保存新图像
}
3、效果。
五、图像渐变合并
1、方法(简单好玩的一个小玩意)。
将两个图形横向渐变合并。
2、效果。
六、图像加密
1、混沌加密。
用密码作为信号的初始值,利用混沌微分方程产生一系列整数,然后用它们依次和图像中像素点的R、G、B值进行异或(XOR)运算,最后得到一幅杂乱无章的图像。解密时采取同样的步骤,只需保证产生信号的初始值相同即可(即密码正确),因为异或运算是可逆的。
思路很简单,但这背后的原理却极为鲜明的体现了混沌的特点。首先:混沌是一个确定性系统,只要所有的初始值完全相同,那么后续的衍化也会一模一样,这是我们可以成功解密的原因。其次,我们还利用了混沌系统对初始条件的敏感性。假如一幅图像混沌加密的密码是2012,那么哪怕解密时输入2013,得到图像还是杂乱无章的,让解密者无法知道正确的密码离2013其实很接近了。
混沌方程:
PrivateSub go()
u3 = u1 + (u2 - u1) * dt / (mima * c1) - ((-0.00041) * u1 + (1 / 2) * (-0.00035) * (Math.Abs(u1 + 1) - Math.Abs(u1 - 1))) * dt / c1
u4 = u2 + (u1 - u2) * dt / (mima * c2) + i * dt / c2
i2 = i - u2 * dt / l - r * i * dt / l
u1 = u3 Mod 256
u2 = u4 Mod 256
i = i2 Mod 256
EndSub
2、随机交换加密。
首先剔除图像中一些像素点的信息,得到一些空余的空间,并把剩下像素点的位置信息(第几行第几列)存在这些空余的空间中。接着随机交换所有像素点,然后用输入的密码和对每个点都生成的随机数来对各个像素点信息进行异或运算,并把这些产生的随机数也存入到图片剩余的空间中。
这种方法看起来也能达到混沌加密的效果,但需要浪费3/4的像素信息。
核心代码:
Dim openFileAs OpenFileDialog
openFile = New OpenFileDialog()
openFile.Filter = "图像文件|*.jpg"
If (openFile.ShowDialog() <> Windows.Forms.DialogResult.OK)Or (openFile.FileName ="") Then
Return
EndIf
Dim tStringAsString
tString = InputBox("请输入密码", ,"0")
Dim mimaAsLong
ForEach tChrAs Char In tString
mima = (mima + Asc(tChr))Mod 256
Next
Dim openImageAs Bitmap
openImage = Bitmap.FromFile(openFile.FileName)
Dim newImageAs Bitmap
newImage = New Bitmap(openImage.Width * 2, openImage.Height * 2)
Randomize()
Dim nowX, nowY, newX, newY, c(5)AsInteger
Dim mAsInteger
m = 73
For iAsInteger = 0 To openImage.Width - 1
For j As Integer = 0To openImage.Height - 1
nowX = i
nowY = j
c(1) = openImage.GetPixel(nowX, nowY).R
c(3) = openImage.GetPixel(nowX, nowY).G
c(4) = openImage.GetPixel(nowX, nowY).B
For k As Integer = 1To 4
If k = 2 Then
Continue For
End If
newImage.SetPixel(i * 2 + kMod 2, j * 2 + kMod 3, Color.FromArgb(i, j, c(k)))
Next
Next
Next
For iAsInteger = 0 To newImage.Width \ 2 - 1
For j As Integer = 0To newImage.Height \ 2 - 1
For k As Integer = 1To 4
If k = 2 Then
Continue For
End If
nowX = i * 2 + kMod 2
nowY = j * 2 + kMod 3
newX = (CInt(Rnd() * (newImage.Width \ 2 - 1))Mod 256) * 2 + kMod 2
newY = (CInt(Rnd() * (newImage.Height \ 2 - 1))Mod 256) * 2 + kMod 3
c(1) = newImage.GetPixel(newX, newY).R
c(3) = newImage.GetPixel(newX, newY).G
c(4) = newImage.GetPixel(newX, newY).B
newImage.SetPixel(newX, newY, Color.FromArgb(newImage.GetPixel(nowX, nowY).R, newImage.GetPixel(nowX, nowY).G, newImage.GetPixel(nowX, nowY).B))
newImage.SetPixel(nowX, nowY, Color.FromArgb(c(1), c(3), c(4)))
Next
Next
Next
For iAsInteger = 0 To newImage.Width / 2 - 1
For jAsInteger = 0 To newImage.Height / 2 - 1
nowX = i * 2
nowY = j * 2
newImage.SetPixel(nowX, nowY, Color.FromArgb(CInt(Rnd() * 255),CInt(Rnd() * 255),CInt(Rnd() * 255)))
c(1) = newImage.GetPixel(nowX, nowY).R
c(3) = newImage.GetPixel(nowX, nowY).GXor mima
c(4) = newImage.GetPixel(nowX, nowY).B
For k As Integer = 1To 4
If k = 2 Then
Continue For
End If
nowX = i * 2 + kMod 2
nowY = j * 2 + kMod 3
If c(k) Mod 4 = 1 Then
newImage.SetPixel(nowX, nowY, Color.FromArgb(newImage.GetPixel(nowX, nowY).RXor c(k)Xor mima, newImage.GetPixel(nowX, nowY).G, newImage.GetPixel(nowX, nowY).B))
ElseIf c(k) Mod 4 = 2 Then
newImage.SetPixel(nowX, nowY, Color.FromArgb(newImage.GetPixel(nowX, nowY).R, newImage.GetPixel(nowX, nowY).GXor c(k)Xor mima, newImage.GetPixel(nowX, nowY).B))
ElseIf c(k) Mod 4 = 3 Then
newImage.SetPixel(nowX, nowY, Color.FromArgb(newImage.GetPixel(nowX, nowY).R, newImage.GetPixel(nowX, nowY).G, newImage.GetPixel(nowX, nowY).BXor c(k)Xor mima))
End If
Next
Next
Next
Dim saveFileAs SaveFileDialog
saveFile = New SaveFileDialog()
saveFile.Filter = "图像文件|*.jpg"
If (saveFile.ShowDialog() <> Windows.Forms.DialogResult.OK)Or (openFile.FileName ="") Then
Return
EndIf
newImage.Save(saveFile.FileName)