- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标:从相机透视图中获取一个点(或一组点)并将其转换到相应的地平面点。
方法:使用findHomography
来获取单应性Mat
。计划使用perspectiveTransform()
。
问题:无法解释单应性Mat
,也不了解如何继续。看来 9 个元素中有 5 个为空,我认为这意味着单应性有问题,尽管无法解释结果,所以 a 做了一些打印语句。
import org.opencv.calib3d.*;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.*;
import java.util.List;
import java.util.LinkedList;
import java.util.ArrayList;
final public class HomographyTest {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // needed by OpenCV
String rfileoutput = "/home/will/dev/Homog.jpg";
String ofileoutput = "/home/will/dev/HomogOutput.jpg";
Point SEShedCornerDst = new Point(49, 74);
Point CloseForsythiaDst = new Point(41, 41);
Point CornerHazelDst = new Point(111, 157);
Point FarForsythiaDst = new Point(175, 21);
Point FirstLiquidAmberDst = new Point(235, 164);
Point SecondLiquidAmberDst = new Point(282, 721);
Point ThirdLiquidAmberDst = new Point(317, 544);
Point SEShedCornerSrc = new Point(30, 231);
Point CloseForsythiaSrc = new Point(160, 290);
Point CornerHazelSrc = new Point(50, 125);
Point FarForsythiaSrc = new Point(628, 146);
Point FirstLiquidAmberSrc = new Point(299, 64);
Point SecondLiquidAmberSrc = new Point(146, 37);
Point ThirdLiquidAmberSrc = new Point(48,34);
Point [] srcArray = new Point[7];
srcArray[0] = SEShedCornerSrc;
srcArray[1] = CloseForsythiaSrc;
srcArray[2] = CornerHazelSrc;
srcArray[3] = FarForsythiaSrc;
srcArray[4] = FirstLiquidAmberSrc;
srcArray[5] = SecondLiquidAmberSrc;
srcArray[6] = ThirdLiquidAmberSrc;
Mat OutputMat = new Mat();
LinkedList<Point> dstArray = new LinkedList<Point>();
dstArray.add(SEShedCornerDst);
dstArray.add(CloseForsythiaDst);
dstArray.add(CornerHazelDst);
dstArray.add(FarForsythiaDst);
dstArray.add(FirstLiquidAmberDst);
dstArray.add(SecondLiquidAmberDst);
dstArray.add(ThirdLiquidAmberDst);
MatOfPoint2f dst = new MatOfPoint2f();
dst.fromList(dstArray);
MatOfPoint2f src = new MatOfPoint2f();
src.fromArray(srcArray);
Mat Homog;
Homog = Calib3d.findHomography(src, dst, Calib3d.RANSAC, 10, OutputMat);
System.out.println("Columns = " + Homog.cols());
System.out.println("Rows = " + Homog.rows());
System.out.println("Width = " + Homog.width());
System.out.println("Dims = " + Homog.dims());
for (int i=1; i<= Homog.cols();i++){
for (int j=1; j<=Homog.rows();j++){
System.out.println("Row, column " + i + "," + j + " = " + Homog.get(j, i));
}
System.out.println();
}
System.out.println(Homog.toString());
System.out.println(OutputMat.toString());
Highgui.imwrite(rfileoutput, Homog);
Highgui.imwrite(ofileoutput, OutputMat);
}
}
输出;
Columns = 3
Rows = 3
Width = 3
Dims = 2
Row, column 1,1 = [D@674f1c67
Row, column 1,2 = [D@7ad1e32d
Row, column 1,3 = null
Row, column 2,1 = [D@6999de59
Row, column 2,2 = [D@74d4db38
Row, column 2,3 = null
Row, column 3,1 = null
Row, column 3,2 = null
Row, column 3,3 = null
Mat [ 3*3*CV_64FC1, isCont=true, isSubmat=false, nativeObj=0x7f744016bb50, dataAddr=0x7f744016b940 ]
Mat [ 7*1*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x7f7440166fe0, dataAddr=0x7f744016b9b0 ]
我走在正确的道路上吗?如果没有,我该怎么办?
如果是这样,在 perspectiveTransform
的 src Mat
中输入什么类型,以及如何在它所说的两个 channel 中执行此操作?
最佳答案
我无法真正解释你的代码,尤其是你的观点,但我认为这并不重要,因为正如你所说,你的目标是从两组点创建一个单应性矩阵,并用所得的单应性矩阵透视地变换图像.
迭代单应性矩阵
首先,您通过单应性矩阵(这是一个 3x3 矩阵)进行迭代时得到 null
的原因是因为 Mat
索引就像数组一样从 0 开始并以“长度 - 1”结束。
它应该看起来像这样:
for (int i = 0; i < homography.cols(); i++){
for (int j = 0; j < homography.rows(); j++){
System.out.println("[" + i + "," + j + "] = " + Arrays.toString(homography.get(j, i)));
}
}
查找单应性并应用(到图像)
要查找 src
和 dst
平面之间的单应性矩阵,您可以使用 findHomography()
。有关此函数的更多信息,其参数请参见 API
// obtain your homography mat (picked your parameters.. you have to play to get the right results)
Mat homography = Calib3d.findHomography(src, dst, Calib3d.RANSAC, 10);
// image you want to transform
Mat image = Highgui.imread("image/img.jpg");
// outputMat will contain the perspectively changed image
Imgproc.warpPerspective(image, outputMat, homography, new Size(image.cols(), image.rows()));
将单应性应用于单个点(不是图像)
Mat src = new Mat();
// push a mat object with your points to the src
src.push_back(new MatOfPoint2f(new Point(x,y)));
// dst will contain your transformed points
Core.perspectiveTransform(src, dst, homography)
顺便说一句..
在 Java 中,变量名通常以小写字母开头。我看到了 Homog
和 OutputMat
。当我读到类似的东西时,我希望它们是类。
关于Java findHomography 将图像点变换为地平面点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972703/
目标:从相机透视图中获取一个点(或一组点)并将其转换到相应的地平面点。 方法:使用findHomography来获取单应性Mat。计划使用perspectiveTransform()。 问题:无法解释
我用过这个code作为在场景中检测我的矩形目标的基础。我使用 ORB 和 Flann Matcher。我已经能够使用 findHomography() 和 perspectiveTransform()
使用 opencv2 - 2.4.9 尝试使用 cv2.findHomography 计算单应矩阵时出现以下错误。我使用的值显然有问题,尤其是 rect_points 矩阵。如果我更改矩阵的值以使它们
我想旋转图像而不求助于 cv2.warpPerspective()。如何从 cv2.findHomography() 函数输出中获取角度? It didn't help # Find homograp
我尝试在以下 opencv/c++ 示例中运行代码片段 http://docs.opencv.org/3.1.0/d7/dff/tutorial_feature_homography.html#gsc
我看了这段代码,它给出了 http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.h
我让用户在两张图片上选择 5 个点,它们的大小不一样(也许这就是问题所在)。当用户在任意图像上选择一个点时,我将 Point2f 推到一个专用于该特定图像的 vector 。 所以在一个实例中我有以下
我试图在 Python 中使用 opencv 为 rgb 和 rotated 找到两个图像的单应矩阵: print(rgb.shape, rotated.shape) H = cv2.findHomo
当使用 findHomography() 时: Mat H = findHomography( obj, scene, cv::RANSAC , 3, hom_mask, 2000, 0.995 );
我正在尝试构建 OpenCV 附带的示例程序 brief_match_test.cpp,但是当我运行该程序时,我不断从 cv::findHomography() 函数中收到此错误: OpenCV Er
我正在使用 features2d(ORB、SIFT 等)进行一些对象检测 我正在使用 RANSAC 进一步研究单应性。我发现很多好的点被错误地标记为异常值。 对象(书)内部有很多不应该是异常值的异常值
我正在 OpenCV 中开发全景图/全景图应用程序,但遇到了一个我真的无法弄清楚的问题。要了解全景照片的外观,请查看全景图维基百科文章:http://en.wikipedia.org/wiki/Pan
我正在使用 OpenCV 的 SURF 特征检测来比较两个图像。当我选择两个相同的图像(有时选择相同的图像)时,我得到这个: OpenCV Error: Assertion failed (CV_I
我正在为 opencv 使用 python 绑定(bind)。我正在使用关键点检测和描述(即 SURF、SIFT、...)来查找包含在目标图像中的模板图像,但是有一个问题:模板可以在目标图像中“挤压”
我目前迷失在 OpenCV 文档中,正在寻找一些关于函数可能排序的指导,或者可能是 OpenCV 中我还没有遇到的函数...... 我正在跟踪摄像机馈送中的激光 Blob 到投影屏幕上的某个位置。到目
我已经检查过 stackOverflaw,尤其是在这个 link 中但它没有回答我的问题。 我使用 Ransac 和 OpenCv 计算单应性以匹配两张图片。这里对应的代码: Mat H = find
这里是Features2D + Homography 从打开的 cv 文档中查找已知对象的代码 #include #include #include #include #include #in
我无法使用 OpenCV 示例在 Android 场景中查找对象。我从 OpenCV4Android SDK 中获取预构建的静态库。我的安卓.mk # Open CV libraries in
作为调用 findHomography() 的结果,我得到了一个 3x3 矩阵 mtx[3][3]。该矩阵包含 mtx[0][2] 和 mtx[1][2] 中的翻译部分。但是我怎样才能从这个 3x3
我将 OpenCV 的函数 findHomography 与 RANSAC 方法结合使用,以便找到将两个图像与一组关键点相关联的单应性。 主要问题是我在任何地方都找不到函数输出的掩码矩阵的值是多少。
我是一名优秀的程序员,十分优秀!