OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 381|回复: 1

STM32光流

[复制链接]

  离线 

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-5-5
在线时间
73 小时
发表于 2018-2-7 14:42:19 | 显示全部楼层 |阅读模式
正点原子公众号
之前一直是用的PIXFLOW和匿名的光流 所以一直想自己做一个理解一下其中的过程
匿名的只是为了赚钱 所以不开源  只有看pixflow的源码了
其中截取了一部分复制到了自己的工程里
  • ///////////////////////////////////////////////////////
  • //函数功能:检测某点是否是特征点
  • ///////////////////////////////////////////////////////
  • static inline uint32_t compute_diff(uint8_t *image, uint16_t offX, uint16_t offY, uint16_t row_size)
  • {
  •         uint16_t off = (offY + 2) * row_size + (offX + 2); // we calc only the 4x4 pattern
  •         uint32_t acc;
  •         //4*4像素向下求差,再累加
  •         acc = __USAD8 (*((uint32_t*) &image[off + 0 + 0 * row_size]), *((uint32_t*) &image[off + 0 + 1 * row_size]));
  •         acc = __USADA8(*((uint32_t*) &image[off + 0 + 1 * row_size]), *((uint32_t*) &image[off + 0 + 2 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image[off + 0 + 2 * row_size]), *((uint32_t*) &image[off + 0 + 3 * row_size]), acc);
  •         //4*4像素向右求差,再累加
  •         uint32_t col1 = (image[off + 0 + 0 * row_size] << 24) | image[off + 0 + 1 * row_size] << 16 | image[off + 0 + 2 * row_size] << 8 | image[off + 0 + 3 * row_size];
  •         uint32_t col2 = (image[off + 1 + 0 * row_size] << 24) | image[off + 1 + 1 * row_size] << 16 | image[off + 1 + 2 * row_size] << 8 | image[off + 1 + 3 * row_size];
  •         uint32_t col3 = (image[off + 2 + 0 * row_size] << 24) | image[off + 2 + 1 * row_size] << 16 | image[off + 2 + 2 * row_size] << 8 | image[off + 2 + 3 * row_size];
  •         uint32_t col4 = (image[off + 3 + 0 * row_size] << 24) | image[off + 3 + 1 * row_size] << 16 | image[off + 3 + 2 * row_size] << 8 | image[off + 3 + 3 * row_size];
  •         //全部累加
  •         acc = __USADA8(col1, col2, acc);
  •         acc = __USADA8(col2, col3, acc);
  •         acc = __USADA8(col3, col4, acc);
  •         return acc;
  • }

[color=rgb(51, 102, 153) !important]复制代码

  • ///////////////////////////////////////////////////////
  • //函数功能:比较两副8X8像素图片的相似度
  • ///////////////////////////////////////////////////////
  • static inline uint32_t compute_sad_8x8(uint8_t *image1, uint8_t *image2, uint16_t off1X, uint16_t off1Y, uint16_t off2X, uint16_t off2Y, uint16_t row_size)
  • {
  •         uint16_t off1 = off1Y * row_size + off1X; // image1
  •         uint16_t off2 = off2Y * row_size + off2X; // image2
  •         //两副8*8像素对应相减,再累加
  •         uint32_t acc;
  •         //第一行相减,再累加
  •         acc = __USAD8 (*((uint32_t*) &image1[off1 + 0 + 0 * row_size]), *((uint32_t*) &image2[off2 + 0 + 0 * row_size]));
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 0 * row_size]), *((uint32_t*) &image2[off2 + 4 + 0 * row_size]), acc);
  •         //第二行相减,再累加,依次类推
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 1 * row_size]), *((uint32_t*) &image2[off2 + 0 + 1 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 1 * row_size]), *((uint32_t*) &image2[off2 + 4 + 1 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 2 * row_size]), *((uint32_t*) &image2[off2 + 0 + 2 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 2 * row_size]), *((uint32_t*) &image2[off2 + 4 + 2 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 3 * row_size]), *((uint32_t*) &image2[off2 + 0 + 3 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 3 * row_size]), *((uint32_t*) &image2[off2 + 4 + 3 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 4 * row_size]), *((uint32_t*) &image2[off2 + 0 + 4 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 4 * row_size]), *((uint32_t*) &image2[off2 + 4 + 4 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 5 * row_size]), *((uint32_t*) &image2[off2 + 0 + 5 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 5 * row_size]), *((uint32_t*) &image2[off2 + 4 + 5 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 6 * row_size]), *((uint32_t*) &image2[off2 + 0 + 6 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 6 * row_size]), *((uint32_t*) &image2[off2 + 4 + 6 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 7 * row_size]), *((uint32_t*) &image2[off2 + 0 + 7 * row_size]), acc);
  •         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 7 * row_size]), *((uint32_t*) &image2[off2 + 4 + 7 * row_size]), acc);
  •         return acc;
  • }

[color=rgb(51, 102, 153) !important]复制代码



然后每隔4个像素来找特征点
  •                         //上下左右循环移动4个像素对比图片相似度
  •                         for(int8_t yy=winmin; yy<=winmax; yy++)
  •                         {
  •                                 for(int8_t xx=winmin; xx<=winmax; xx++)
  •                                 {
  •                                         //计算匹配度
  •                                         temp_match = compute_sad_8x8(image_new, image_old, x, y, x + xx, y + yy, wid);
  •                                         //寻找最小值,越小越相似
  •                                         if (temp_match < match_min)
  •                                         {
  •                                                 sumx = xx;
  •                                                 sumy = yy;
  •                                                 match_min = temp_match;
  •                                         }
  •                                 }
  •                         }

[color=rgb(51, 102, 153) !important]复制代码



最后实际的效果还不错 就是激光模块给手焊坏了
IMG_20180120_191821.jpg IMG_20180120_191811.jpg TIM截图20180207113007.png



好玩的STM32开源项目  554150925
本人的小店:https://shop110563242.taobao.com/
回复

使用道具 举报

  离线 

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-5-5
在线时间
73 小时
 楼主| 发表于 前天 17:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-2-23 16:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */