- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试做 this ,我发现 this 。他的问题不是我想问的,但我想做同样的事情。我可以在图像上找到特征并绘制特征描述符,但是对象周围的边界框很奇怪。抱歉,我不能在这里发布我的结果,出来的线不是矩形,不在对象 here is my result 周围,我做错了什么还是有其他方法可以做到?
对不起我的英语不好,谢谢你的帮助
private void Featrue_found(){
MatOfKeyPoint templateKeypoints = new MatOfKeyPoint();
MatOfKeyPoint keypoints = new MatOfKeyPoint();
MatOfDMatch matches = new MatOfDMatch();
Object = new Mat(CvType.CV_32FC2);
Object = Highgui.imread(Environment.getExternalStorageDirectory()+ "/Android/data/" + getApplicationContext().getPackageName() + "/Files/Object.jpg", Highgui.CV_LOAD_IMAGE_UNCHANGED);
Resource = new Mat(CvType.CV_32FC2);
Resource = Highgui.imread(Environment.getExternalStorageDirectory()+ "/Android/data/" + getApplicationContext().getPackageName() + "/Files/Resource.jpg", Highgui.CV_LOAD_IMAGE_UNCHANGED);
Mat imageOut = Resource.clone();
FeatureDetector myFeatures = FeatureDetector.create(FeatureDetector.ORB);
myFeatures.detect(Resource, keypoints);
myFeatures.detect(Object, templateKeypoints);
DescriptorExtractor Extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
Mat descriptors1 = new Mat();
Mat descriptors2 = new Mat();
Extractor.compute(Resource, keypoints, descriptors1);
Extractor.compute(Resource, templateKeypoints, descriptors2);
//add Feature descriptors
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
matcher.match(descriptors1, descriptors2, matches);
List<DMatch> matches_list = matches.toList();
MatOfDMatch good_matches = new MatOfDMatch();
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors1.rows(); i++ )
{
double dist = matches_list.get(i).distance;
if( dist < min_dist )
min_dist = dist;
if( dist > max_dist )
max_dist = dist;
}
//-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
for( int i = 0; i < descriptors1.rows(); i++ )
{
if( matches_list.get(i).distance < 3*min_dist ){
MatOfDMatch temp = new MatOfDMatch();
temp.fromArray(matches.toArray()[i]);
good_matches.push_back(temp);
}
}
MatOfByte drawnMatches = new MatOfByte();
Features2d.drawMatches(Resource, keypoints, Object, templateKeypoints, good_matches, imageOut, Scalar.all(-1), Color_Red, drawnMatches, Features2d.NOT_DRAW_SINGLE_POINTS);
//no Feature descriptors
//Features2d.drawMatches(Resource, keypoints, Object, templateKeypoints, matches, imageOut);
LinkedList<Point> objList = new LinkedList<Point>();
LinkedList<Point> sceneList = new LinkedList<Point>();
List<DMatch> good_matches_list = good_matches.toList();
List<KeyPoint> keypoints_objectList = templateKeypoints.toList();
List<KeyPoint> keypoints_sceneList = keypoints.toList();
for(int i = 0; i<good_matches_list.size(); i++)
{
objList.addLast(keypoints_objectList.get(good_matches_list.get(i).queryIdx).pt);
sceneList.addLast(keypoints_sceneList.get(good_matches_list.get(i).trainIdx).pt);
}
MatOfPoint2f obj = new MatOfPoint2f();
obj.fromList(objList);
MatOfPoint2f scene = new MatOfPoint2f();
scene.fromList(sceneList);
//findHomography
Mat hg = Calib3d.findHomography(obj, scene);
Mat obj_corners = new Mat(4,1,CvType.CV_32FC2);
Mat scene_corners = new Mat(4,1,CvType.CV_32FC2);
obj_corners.put(0, 0, new double[] {0,0});
obj_corners.put(1, 0, new double[] {Object.cols(),0});
obj_corners.put(2, 0, new double[] {Object.cols(),Object.rows()});
obj_corners.put(3, 0, new double[] {0,Object.rows()});
//obj_corners:input
Core.perspectiveTransform(obj_corners, scene_corners, hg);
Core.line(imageOut, new Point(scene_corners.get(0,0)), new Point(scene_corners.get(1,0)), new Scalar(0, 255, 0),4);
Core.line(imageOut, new Point(scene_corners.get(1,0)), new Point(scene_corners.get(2,0)), new Scalar(0, 255, 0),4);
Core.line(imageOut, new Point(scene_corners.get(2,0)), new Point(scene_corners.get(3,0)), new Scalar(0, 255, 0),4);
Core.line(imageOut, new Point(scene_corners.get(3,0)), new Point(scene_corners.get(0,0)), new Scalar(0, 255, 0),4);
Highgui.imwrite(Environment.getExternalStorageDirectory()+ "/Android/data/" + getApplicationContext().getPackageName() + "/Files/result_match.jpg", imageOut);
}
最佳答案
您的情况下匹配次数不够。匹配也不正确。为了获得最佳结果,我建议在单应性计算中使用 RANSAC 并更改良好匹配的阈值。
if( matches_list.get(i).distance < 3*min_dist ){
MatOfDMatch temp = new MatOfDMatch();
temp.fromArray(matches.toArray()[i]);
good_matches.push_back(temp);
}
将 3*min_dist 设为 4*min_dist 并检查是否存在良好的特征匹配。如果不是,那么您应该选择其他一些特征检测器(SURF、SIFT、harrison)Harrison 可能会给出嘈杂的结果,但它会产生最大数量的特征点。或者,如果这些都不起作用,则使用更好的图像质量图像。
关于android - OpenCV Homography - 4线不在对象周围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19906282/
我想问一个我已经在 OpenCV 板上问过但没有得到答案的问题:http://answers.opencv.org/question/189206/questions-about-the-fundam
我正在使用OpenCV在Android上创建应用程序,并且需要Feature2d和Homography的Java代码。我需要像视频一样连续处理。我不是C++专家,所以无法移植。因此,如果可以的话,请提
我有两张相同的图片,但第二张变形了并且尺寸不同。我希望能够在第一张图片上选择一个点并在第二张图片上找到完全相同的点。图片的同步将在每张图片上进行4个点。 例子: 正常图片 图片失真 结果将是一个函数,
我正在尝试使用 SurfFeatureDetect 和 FLANN 匹配器检测对象。但是,代码无法准确检测图像。我还以图片格式发布了结果。 这是我在 opencv 教程中的代码 website int
我尝试做 this ,我发现 this 。他的问题不是我想问的,但我想做同样的事情。我可以在图像上找到特征并绘制特征描述符,但是对象周围的边界框很奇怪。抱歉,我不能在这里发布我的结果,出来的线不是矩形
引用this回答this question : What is happening is that you're considering all the keypoints detected in t
当我使用函数 cvFindHomograhpy() 获取结果时遇到问题。 它给出负坐标的结果,我现在将解释我在做什么。 我正在使用光流法进行视频稳定。我已经估计了第一帧和第二帧中特征的位置。现在,我的
我正在处理由 OpenCV 计算的单应性。我目前使用这个单应性来使用下面的函数来转换点。此函数执行我需要的任务,但我不知道它实际上是如何工作的。 谁能逐行准确地解释最后 3 行代码背后的逻辑/理论,我
我正在尝试计算视频的两个连续帧之间的比例、旋转和平移。所以基本上我匹配了关键点,然后使用 opencv 函数 findHomography() 来计算单应矩阵。 homography = findHo
我在将检测到的对象的轮廓放在正确位置时遇到了一些问题,就好像坐标在错误的位置一样。我将 hessian 设置为 2000,并且过滤了小于最小距离 3 倍的匹配项。任何帮助,将不胜感激。 运行匹配和单应
我一直在尝试编译this Android Studio 2.2 中的源代码,使用 Android NDK、OpenCV-2.4.10 和 OpenCV-2.4.10-android-sdk。我已经能够
在我的 Python/OpenCV 代码中,我使用随机单应性来模拟视点变化(我正在评估兴趣点检测器并希望避免搜索图像对)。 是否可以计算对极线和一幅图像及其扭曲版本之间的基本矩阵?我拥有的唯一信息是我
对不起,如果这听起来很愚蠢,但我真的需要问这个问题。 一旦计算出单应性,我能否使用它来将在一台相机中检测到的物体中心的二维坐标作为二维坐标投影到另一台立体相机? 最佳答案 一旦您拥有映射两个相机之间转
我有两张图片(A 和 B),一张与另一张略有扭曲,它们之间存在平移、旋转和比例差异(例如,这些图片:) Ssoooooooo 我需要在图片 B 中应用一种变换,以便补偿存在的失真/平移/旋转,使两张图
我正在使用光流来跟踪一些功能,我是初学者,必须遵循这些步骤 匹配良好的特征进行跟踪 对它们进行 Lucas-Kanade 算法 查找第一帧和当前帧之间的单应性 进行相机校准 分解单应图 现在我不明白的
我正在使用光流来跟踪一些功能,我是初学者,必须遵循这些步骤 匹配良好的特征进行跟踪 对它们进行 Lucas-Kanade 算法 查找第一帧和当前帧之间的单应性 进行相机校准 分解单应图 现在我不明白的
库:OpenCV目标:Android (OpenCV4Android) 我尝试计算世界平面(例如监视器屏幕)的单应性以获得相机姿势,对其进行变换并将点重新投影回以用于跟踪任务。我正在使用 OpenCV
使用 JavaCV。我在 ArrayList 中有 2 组 CvPoint2D32f 点,一组来自手机的图像采集器,另一组来自恒定的已知图像源。 我想应用 cvFindHomogrpahy() 方法,
我正在尝试通过 python 使用 opencv 在火车图像中查找多个对象,并将其与从查询图像中检测到的关键点进行匹配。对于我的情况,我正在尝试检测下面提供的图像中的网球场.我看了网上的教程,发现只能
我正在使用 Opencv python 接口(interface)并获得了单应矩阵 H。它似乎工作正常,因为我可以使用扭曲透视从源图像中获取扭曲图像。我现在尝试使用 H 和 Inverse H 在两个
我是一名优秀的程序员,十分优秀!