我正在使用opencv为iPhone开发应用程序.我必须使用方法solvePnPRansac:
http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html
对于这种方法,我需要提供一个相机矩阵:
__ __
| fx 0 cx |
| 0 fy cy |
| _0 0 1 _ |
其中cx和cy代表图像的中心像素位置,fx和fy代表焦距,但这就是文档中所说的.我不确定这些焦距应该提供什么.iPhone 5的焦距为4.1毫米,但我不认为这个值可以按原样使用.
我检查了另一个网站:
http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
这显示了opencv如何创建相机矩阵.这里说明焦距是以像素为单位测量的.
我检查了另一个网站:
http://www.velocityreviews.com/forums/t500283-focal-length-in-pixels.html
(大约一半)它表示可以使用以下公式将焦距从毫米单位转换为像素:fx = fy = focalMM*pixelDensity/25.4;
另一个链接我发现fx = focalMM*width /(sensorSizeMM); fy = focalMM*length /(sensorSizeMM);
我不确定这些方程式以及如何正确地创建这个矩阵.
任何有关如何创建精确相机矩阵(特别是iPhone 5)的帮助,建议或链接将不胜感激,
艾萨克
ps我认为(fx/fy)或(fy/fx)可能等于相机的纵横比,但这可能完全错误.
更新:
使用这个链接,我可以弄清楚他们是如何想要fx和fy格式化的,因为他们使用它来相对于它们与中心的距离来缩放角度.因此,fx和fy很可能是像素/(单位长度),但我仍然不确定这个单位长度需要什么,只要x和y相互缩放,它是否可以是任意的?
iphone opencv computer-vision augmented-reality camera-calibration
我试图跟踪一张纸的角落的位置,因为我相对于Android相机移动它(您可以假设纸张将是与背景完全不同的颜色).我想找到android屏幕上每个角落的x,y坐标.我还希望能够改变纸张的角度,这样它就不一定会呈现出完美的矩形.
我正在使用opencv 2.4.1 for Android,但我找不到cvgoodfeaturetotrack或cvfindcornersubpix在包中.现在我正在考虑使用CvCanny算法来找到边缘,然后使用边缘cvfindcontours找到线条的主要交点以找到角落.
任何建议或源代码将不胜感激.
我一直在尝试将视图从xml扩展到相应的视图对象,然后将这些视图对象添加到编程的视图组中.但是,每当我调用myviewgroup.addView(子视图)时,子视图似乎都会丢失xml代码应该给出的所有按钮和内容.但是,子视图确实具有的一个方面是我编写的背景颜色,以确保为子视图提供正确的尺寸.子视图具有正确的尺寸,但其组件均不可见
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
viewchanger= new ViewChanger(this); //my viewgroup
View mainmenu= inflater.inflate(R.layout.main, null); //the xml code
mainmenu.setBackgroundColor(Color.rgb(0, 0, 255));
viewchanger.addView(mainmenu);
setContentView(viewchanger);
Run Code Online (Sandbox Code Playgroud)
上面的代码只是将我的屏幕背景设置为蓝色,但没有任何按钮显示.另外,当我setContentView(mainmenu)时,一切都完全从那个xml代码和背景颜色中显示出来.这个视图组的要点是,我可以在多个视图中的任何一个视图之间切换,而不管它们作为子视图的顺序.
这是viewchanger的代码.我希望它有7个子视图,当我调用方法setView(int v)时,我希望所有其他视图都消失,我只希望那个视图可见.
public class ViewChanger extends ViewGroup{
/**Represent which view to show, only one can show at a time*/
public static final int MainMenu=0, ChooseMap=1, MapOptions=2,
SetLocation=3, view=4, EditMap=5, CreateMap=6;
private int current; //the current view
private View[] views= new View[7];
public ViewChanger(Context context) {
super(context);
//load 7 views into view array here
//LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); …Run Code Online (Sandbox Code Playgroud)