VC+DirectShow对视频进行图片处理之四
2007-03-15 21:48:55 来源:WEB开发网核心提示: MMX 最大的好处是可以自动保证处理的值范围为0 ~ 255,节省判断,VC+DirectShow对视频进行图片处理之四(4),而且MMX寄存器是64位的,一次可处理32bit图像的两个点,即第一点白点的在图中位置(x,y),其它的我也不太懂,您可参考相关资料
MMX 最大的好处是可以自动保证处理的值范围为0 ~ 255,节省判断,而且MMX寄存器是64位的,一次可处理32bit图像的两个点。其它的我也不太懂,您可参考相关资料。
下面列出浮雕效果代码,它是减去右边点的,由于不进行行列判断,每行最后一点减去的是下一行的首点。
__int64 Mask = 0x8080808080808080; // 0x80 = 128,就是亮度的增加值
UINT a = bmpBufferLen >> 3; // 缓冲区长度(按 BYTE 计算)除以 8(两个点的大小),计算要循环的次数
_asm{
mov esi,pIn; // 要处理的缓冲区指针
mov edi,pOut; // 结果缓冲区指针
mov eax,a; // 循环次数
dec eax; // 循环次数减一,因为最后两点没法减,可以在后面特殊处理,这里不作处理
movq mm1,Mask; // 增加值,movq 是 MMX 的专用汇编指令,请找资料看
_loop: // 循环
mov ecx,esi; // ecx 存储右边点的指针
add ecx,4; // 只加 4 就跳过一点到右边点了
movq mm0,[esi]; // 移动要处理的两点的值到 MMX 寄存器
movq mm2,[ecx]; // 移右边两点的值
psubusb mm0,mm2; // 相减
paddusb mm0,mm1; // 加上增加值
movq [edi],mm0; // 移到结果缓冲区
add esi,8; // 移动到下两点
add edi,8; // 同上
dec eax; // 循环计数减一
jnz _loop; // 不为零就继续循环
emms; // 结束 MMX 使用
}
7. 来点高级的,用摄像头控制鼠标!
看着这个有点神奇吧,其实比什么都要简单。先做好"硬件准备":把摄像头如图摆放,镜头下方放张白纸以使图像中物体界限分明。
软件方面,把图片作阀值处理-- B 值大于 128 的设为黑色,其它的设为白色。因为白纸的作用,您的手或其他物体会在阀值图中显示为白色,如图,再找出图中红点,即第一点白点的在图中位置(x,y),再把图的坐标影射到屏幕坐标就行了。
Tags:VC DirectShow 视频
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接