SIFT--FPGA实现之幅值和幅角计算模块

     该模块的实现,让我走了许多弯路,开始在看文献和文章里面说的都是用cordic算法去做,然后我发现xilinx的IP核里面有这个cordic算法的IP,而且还有求反正切和开方根运算sqrt,让我开心不已,就冒失的跟领导说了,这块很快就搞定了,SIFT用FPGA实现很快就要做完了,结果等我去用IP核的时候,仿真发现不对,开方根只能处理整数和小数开方根运算,而且整数开方根运算误差很大,小数开方根运算还必须输入在0-2之间,瞬间很崩溃,就找怎么实现开方运算,找到文献说有非冗余开方这个方法可以,也看到有篇文献是这么做的,我的乖乖,差点走错道了,想啊 这么做不太好,就用IP核搞反正切运算,发现也不行啊,仿真也不对啊,看手册,发现输入只能是-1到1之间,又无语了。不知道怎么做了,又去找开方运算,发现cordic算法能做开方运算,慢慢查,发现cordic算法都能搞定,这会就开始搞cordic算法,刚开始一头雾水,看那些公式还有图形旋转啊,各种晕,后来发现本文分享的博客,关于cordic算法的,写的很通俗易懂,相当好,才有了了解,但是里面说了cordic算法能求反正切也能求开方根运算,而且是乘个系数补偿回来就好了。

    我把系数乘回去结果不对,又查资料,找到双模式CORDIC算法的fpga实现这篇文章,才解开所有谜题,cordic算法旋转模式求cos和sin,向量模式求幅值和幅角也就是反正切。里面的系数还有放大,1度用多少表示,等等,都明确了,写了verilog代码,看了C语言的,cordic算法是如此的简单粗放。C只需要一个for循环而已,FPGA实现也可以使用for循环,但是不建议那么用,for循环也能综合,但是会造成时间延迟,分开写电路会消耗资源,但是时间快些,所以要自己权衡了。

  现在从高斯滤波模块出来的数据到梯度计算模块再到幅值和幅角计算模块。就都做完了,幅值和幅角计算模块可以参考下面的框图:



这是华中科技大学一篇博士论文里面的,感谢这位师兄的帮助。谢谢!到此sift的FPGA实现已经完成了一大半的工作了。剩下的可以在dsp上实现这样简单点,也可以在FPGA上实现,我要做的是继续在FPGA上实现。加油吧!骚年!!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SIFT-RANSAC算法是一种图像配准算法,可以用于在两图像中找到相同区域。下面是使用Python实现SIFT-RANSAC算法的步骤: 1.导入必要的库 ```python import cv2 import numpy as np from scipy.spatial import distance from collections import Counter ``` 2.加载图像 ```python img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) ``` 3.提取SIFT特征 ```python sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) ``` 4.特征匹配 ```python bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) ``` 5.筛选好的匹配点 ```python good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append(m) ``` 6.使用RANSAC算法进行配准 ```python MIN_MATCH_COUNT = 10 if len(good) > MIN_MATCH_COUNT: src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) matchesMask = mask.ravel().tolist() else: print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT)) matchesMask = None ``` 7.计算匹配点的正确率 ```python if matchesMask is not None: distances = [] for i in range(len(good)): if matchesMask[i] == 1: pt1 = src_pts[i][0] pt2 = dst_pts[i][0] distances.append(distance.euclidean(pt1, pt2)) correct_ratio = Counter(distances).most_common()[0][1] / len(distances) print("Correct Ratio: {:.2f}%".format(correct_ratio * 100)) ``` 以上是使用Python实现SIFT-RANSAC算法的步骤,其中RANSAC算法可以有效地筛选出正确的匹配点,提高匹配的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值