搜索
bottom↓
回复: 9

这段时间做了个STM32的光流

[复制链接]

出0入104汤圆

发表于 2018-2-7 11:30:59 | 显示全部楼层 |阅读模式
之前一直是用的PIXFLOW和匿名的光流
所以一直想自己做一个理解一下其中的过程
匿名的只是为了赚钱 所以不开源  只有看pixflow的源码了
其中截取了一部分
复制到了自己的工程里
  1. ///////////////////////////////////////////////////////
  2. //函数功能:检测某点是否是特征点
  3. ///////////////////////////////////////////////////////
  4. static inline uint32_t compute_diff(uint8_t *image, uint16_t offX, uint16_t offY, uint16_t row_size)
  5. {
  6.         uint16_t off = (offY + 2) * row_size + (offX + 2); // we calc only the 4x4 pattern
  7.         uint32_t acc;
  8.        
  9.         //4*4像素向下求差,再累加
  10.         acc = __USAD8 (*((uint32_t*) &image[off + 0 + 0 * row_size]), *((uint32_t*) &image[off + 0 + 1 * row_size]));
  11.         acc = __USADA8(*((uint32_t*) &image[off + 0 + 1 * row_size]), *((uint32_t*) &image[off + 0 + 2 * row_size]), acc);
  12.         acc = __USADA8(*((uint32_t*) &image[off + 0 + 2 * row_size]), *((uint32_t*) &image[off + 0 + 3 * row_size]), acc);

  13.         //4*4像素向右求差,再累加
  14.         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];
  15.         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];
  16.         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];
  17.         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];

  18.         //全部累加
  19.         acc = __USADA8(col1, col2, acc);
  20.         acc = __USADA8(col2, col3, acc);
  21.         acc = __USADA8(col3, col4, acc);

  22.         return acc;
  23. }
复制代码
  1. ///////////////////////////////////////////////////////
  2. //函数功能:比较两副8X8像素图片的相似度
  3. ///////////////////////////////////////////////////////
  4. 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)
  5. {
  6.         uint16_t off1 = off1Y * row_size + off1X; // image1
  7.         uint16_t off2 = off2Y * row_size + off2X; // image2

  8.         //两副8*8像素对应相减,再累加
  9.         uint32_t acc;
  10.        
  11.         //第一行相减,再累加
  12.         acc = __USAD8 (*((uint32_t*) &image1[off1 + 0 + 0 * row_size]), *((uint32_t*) &image2[off2 + 0 + 0 * row_size]));
  13.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 0 * row_size]), *((uint32_t*) &image2[off2 + 4 + 0 * row_size]), acc);
  14.        
  15.         //第二行相减,再累加,依次类推
  16.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 1 * row_size]), *((uint32_t*) &image2[off2 + 0 + 1 * row_size]), acc);
  17.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 1 * row_size]), *((uint32_t*) &image2[off2 + 4 + 1 * row_size]), acc);

  18.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 2 * row_size]), *((uint32_t*) &image2[off2 + 0 + 2 * row_size]), acc);
  19.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 2 * row_size]), *((uint32_t*) &image2[off2 + 4 + 2 * row_size]), acc);

  20.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 3 * row_size]), *((uint32_t*) &image2[off2 + 0 + 3 * row_size]), acc);
  21.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 3 * row_size]), *((uint32_t*) &image2[off2 + 4 + 3 * row_size]), acc);

  22.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 4 * row_size]), *((uint32_t*) &image2[off2 + 0 + 4 * row_size]), acc);
  23.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 4 * row_size]), *((uint32_t*) &image2[off2 + 4 + 4 * row_size]), acc);

  24.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 5 * row_size]), *((uint32_t*) &image2[off2 + 0 + 5 * row_size]), acc);
  25.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 5 * row_size]), *((uint32_t*) &image2[off2 + 4 + 5 * row_size]), acc);

  26.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 6 * row_size]), *((uint32_t*) &image2[off2 + 0 + 6 * row_size]), acc);
  27.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 6 * row_size]), *((uint32_t*) &image2[off2 + 4 + 6 * row_size]), acc);

  28.         acc = __USADA8(*((uint32_t*) &image1[off1 + 0 + 7 * row_size]), *((uint32_t*) &image2[off2 + 0 + 7 * row_size]), acc);
  29.         acc = __USADA8(*((uint32_t*) &image1[off1 + 4 + 7 * row_size]), *((uint32_t*) &image2[off2 + 4 + 7 * row_size]), acc);

  30.         return acc;
  31. }
复制代码


然后每隔4个像素来找特征点
  1.                         //上下左右循环移动4个像素对比图片相似度
  2.                         for(int8_t yy=winmin; yy<=winmax; yy++)
  3.                         {
  4.                                 for(int8_t xx=winmin; xx<=winmax; xx++)
  5.                                 {
  6.                                         //计算匹配度
  7.                                         temp_match = compute_sad_8x8(image_new, image_old, x, y, x + xx, y + yy, wid);
  8.                                        
  9.                                         //寻找最小值,越小越相似
  10.                                         if (temp_match < match_min)
  11.                                         {
  12.                                                 sumx = xx;
  13.                                                 sumy = yy;
  14.                                                 match_min = temp_match;
  15.                                         }
  16.                                 }
  17.                         }
复制代码


最后实际的效果还不错 就是激光模块给手焊坏了

实际的波形

总之慢慢完善啦

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-3-3 07:19:06 来自手机 | 显示全部楼层
实际效果如何

出0入0汤圆

发表于 2018-3-3 07:50:59 来自手机 | 显示全部楼层
现在有光流摄像头了吧?

出0入104汤圆

 楼主| 发表于 2018-3-3 09:48:25 | 显示全部楼层

实际定点10cm内飘

出0入104汤圆

 楼主| 发表于 2018-3-3 09:48:44 | 显示全部楼层
TANK99 发表于 2018-3-3 07:50
现在有光流摄像头了吧?

那些是商用的,自己做的更有意义

出0入0汤圆

发表于 2018-3-3 10:08:37 来自手机 | 显示全部楼层
路过了解一下。

出0入0汤圆

发表于 2018-3-3 10:11:53 | 显示全部楼层
一块板硬件成本50可以吗

出0入104汤圆

 楼主| 发表于 2018-3-3 10:16:35 | 显示全部楼层
zzipeng 发表于 2018-3-3 10:11
一块板硬件成本50可以吗

成本肯定不止50

出0入0汤圆

发表于 2018-3-3 22:14:25 来自手机 | 显示全部楼层
弱弱问一下 什么是光流呐…

出0入104汤圆

 楼主| 发表于 2018-3-4 12:14:48 | 显示全部楼层
chewy 发表于 2018-3-3 22:14
弱弱问一下 什么是光流呐…

就是一种可以检测画面相对移动方向的相对移动速度的视觉硬件
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 13:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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