OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1375|回复: 9

STM32光流

[复制链接]

  离线 

10

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2017-5-5
在线时间
111 小时
发表于 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/
回复

使用道具 举报

  离线 

10

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2017-5-5
在线时间
111 小时
 楼主| 发表于 2018-2-21 17:33:28 | 显示全部楼层
哇  没人
回复 支持 反对

使用道具 举报

  离线 

58

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2375
金钱
2375
注册时间
2012-10-17
在线时间
554 小时
发表于 2018-2-23 17:30:58 | 显示全部楼层
我前陣子也看完PX4FLOW代碼....你說效果不錯是如何驗證的?
回复 支持 反对

使用道具 举报

  离线 

10

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2017-5-5
在线时间
111 小时
 楼主| 发表于 2018-2-23 19:36:43 | 显示全部楼层
civic7366 发表于 2018-2-23 17:30
我前陣子也看完PX4FLOW代碼....你說效果不錯是如何驗證的?

安装在了小四轴上 定点的效果不错的  而且光流的波形和匿名光流的波形对比了 差不多的

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

使用道具 举报

  离线 

6

主题

532

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1750
金钱
1750
注册时间
2015-5-8
在线时间
271 小时
发表于 2018-2-24 08:52:50 | 显示全部楼层
也在看飞控,还得多学习
回复 支持 反对

使用道具 举报

  离线 

10

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2017-5-5
在线时间
111 小时
 楼主| 发表于 2018-2-24 16:30:44 | 显示全部楼层
炫色康康 发表于 2018-2-24 08:52
也在看飞控,还得多学习

可以

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

使用道具 举报

  离线 

58

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2375
金钱
2375
注册时间
2012-10-17
在线时间
554 小时
发表于 2018-2-26 11:33:00 | 显示全部楼层
樓主~~~~請問你用的影像感測器是哪一款?

回复 支持 反对

使用道具 举报

  离线 

10

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2017-5-5
在线时间
111 小时
 楼主| 发表于 2018-2-26 12:34:46 | 显示全部楼层
civic7366 发表于 2018-2-26 11:33
樓主~~~~請問你用的影像感測器是哪一款?

OV7740  你的PIXflow有MDK的代码?
好玩的STM32开源项目  554150925
本人的小店:https://shop110563242.taobao.com/
回复 支持 反对

使用道具 举报

  离线 

58

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2375
金钱
2375
注册时间
2012-10-17
在线时间
554 小时
发表于 2018-2-26 15:03:32 | 显示全部楼层
有..在掏寶買的但是透過JTAG燒寫之後PX4FLOW就掛了
仿真看它PC指針會跑到很奇怪的地方 嘗試刪掉一些可能跑飛的函數
發現連for迴圈都能跑飛...每次跑飛得地方都可以不一樣
不知到啥問題...無解...
回复 支持 反对

使用道具 举报

  离线 

58

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2375
金钱
2375
注册时间
2012-10-17
在线时间
554 小时
发表于 2018-2-26 15:20:23 | 显示全部楼层
我原本想說自己修復它(自己從頭外設初始化), 結果用了原子的工程模板燒下去把它燒壞了...
應該是PX4FLOW外部晶振不是8M的, 好像是12M還是16M...
套用原本的PLL倍頻係數下去的sysclk直接把F407玩壞了...
其實我不會寫UVC...搞到最後看不到影像也是問題
更不想去看那個mavlink協議...

我有把程式碼移植到PC 隨便拿一個PCAM裝置實驗過效果了
感覺誤差還是挺大...用2把直尺固定住板子照牆壁作平移測試
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

正点原子STM32/FPGA资料免费洗澡上一条 /1 下一条

正点原子公众号

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

GMT+8, 2018-12-15 19:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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