Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

模糊图像怎样进行模板匹配 #99

Open
ohenrygithub opened this issue Aug 13, 2020 · 11 comments
Open

模糊图像怎样进行模板匹配 #99

ohenrygithub opened this issue Aug 13, 2020 · 11 comments

Comments

@ohenrygithub
Copy link

matchSource003
直接匹配似乎匹配不了
尝试了以下方法:
1,阈值分割(二值化),可以匹配到,精度也够,但阈值每次要手动调节,会出现问题;
2,Canny算子获取图像中的边缘,能够匹配到,但精度不够;
3,调节图像的对比度(采用了线性调节和非线性调节两种方式),能匹配到,匹配精度不够;
4,获取图像轮廓,匹配得分较低;

不做任何处理时,跟进程序内部,会显示特征点不够,而无法创建模板;
想了解一下,有没有什么比较简便的方法,可以让算法更容易创建模板,和进行匹配,谢谢

@meiqua
Copy link
Owner

meiqua commented Aug 13, 2020

Detector(int num_features, std::vector<int> T, float weak_thresh = 30.0f, float strong_thresh = 60.0f);

可以调低阈值试试,第三个是匹配时的阈值,第4个是训练时的。

@ohenrygithub
Copy link
Author

@meiqua
调低了第四个参数,能够匹配到了,精度也很好,谢谢!
调低训练阈值后,创建模板时能够找到到更多的特征点了,这样创建模板会轻松一些,估计是这个原理。

@meiqua
Copy link
Owner

meiqua commented Aug 14, 2020

是的。一般来说,训练时想提到物体自己的边缘,所以设的高一点排除阴影之类的干扰。这里需要根据情况调小

@ohenrygithub
Copy link
Author

好的,这样一说就了解得比较透彻了,谢谢。
之前用来测试的图像,包括case1文件夹中的,和其他一些图像,图像都很清晰,所以模板匹配时很容易创建模板,也很容易匹配到。而实际拍摄的图像,由于各种原因(光源亮度、颜色,物体本身表面特性等),都可能造成图像模糊,那么,就有以下4种情况要考虑:
1,图像清晰;
2,图像模糊,但可以创建模板,也可以进行icp配准;
3,图像模糊,不可创建模板;
4,图像模糊,可以创建模板,但ICP处理不理想;

之前的方法,可以解决模糊图像创建模板的问题,不过仍有一些图像,在创建模板后,进行icp处理不是很理想(有的甚至icp处根本就没进行处理),因为对icp配准这块的原理和源码不是很熟悉,不知道有哪些地方可以进行改善,能否指点一二,谢谢!

测试图像:

@meiqua
Copy link
Owner

meiqua commented Aug 17, 2020

刚好昨天ICP改进搞好了,可以参考这个issue,把后两个阈值调低点

@ohenrygithub
Copy link
Author

ohenrygithub commented Aug 18, 2020

好的,上午用模糊图像测试了一下,有改善,icp可以起作用了,不过精度略有不足;
void init_Scene_kdtree_cpu(cv::Mat dx, cv::Mat dy, KDTree_cpu& kdtree, float max_dist_diff = 4.0f,
float low_thresh = 30, float high_thresh = 60);
然后考虑在detector创建时阈值已经调低了(10,30),那么init_Scene_kdtree_cpu是否也要相应调低一些,于是就把low_thresh和high_thresh也调低了(10,30),这样出来的数据就比较准确了;
虽然icp的原理仍不大懂,谢谢了

ms004

@ohenrygithub
Copy link
Author

ohenrygithub commented Aug 18, 2020

查看了一下源码,detector构造函数和init_Scene_kdtree_cpu函数,对两个阈值的使用是不一样的,前者用来寻找特征点,并进行筛选,后者用来做canny算子的参数,不过,粗略看了一下icp相关论文,似乎icp配准的时候,待配准平面也要找到一些特征点,这样才能够对应上,当然具体的做法就不清楚了。
目前要调的参数比较多,如果detector构造函数中的weak_threshold和strong_threshold和 init_Scene_kdtree_cpu函数中的阈值可以通用,用起来就要简便一些。
scene.init_Scene_kdtree_cpu(m_detector->dx_, m_detector->dy_, kdtree, 4, m_detector->weak_thresh(), m_detector->strong_thresh());
不知道这样用会不会有潜在问题。

@meiqua
Copy link
Owner

meiqua commented Aug 18, 2020

分开是为了两部分不要耦合太多。strong_thresh在这里没问题;weak_thresh是训练时候用的,跟检测时关系不大,从意义上来说最好改成strong_thresh/2.

@ohenrygithub
Copy link
Author

好的,谢谢

@ohenrygithub
Copy link
Author

看了一下源码,不知道理解得是否正确,
scene.init_Scene_kdtree_cpu是通过处理图像构建场景,在这里就提取了一些点,作为目标点集;
cuda_icp::RegistrationResult result = cuda_icp::ICP2D_Point2Plane_cpu(model_pcd, scene);
这里是用模板的特征点集和图像的点集做配准,采用的是icp算法中点到面配准的方式;
所以,之前我遇到的问题:icp没有发生作用,其实是初始化的时候遇到的;scene构造是没有获得足够的点造成的;
scene构造的点集从detector获得,detector是从原始图像高斯平衡然后用sobel算子提取边缘获得处理后的图像;

@meiqua
Copy link
Owner

meiqua commented Aug 19, 2020

对的,必须先有点

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants