Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenCV
opencv
提交
6d9c6e9c
O
opencv
项目概览
OpenCV
/
opencv
上一次同步 9 个月
通知
992
Star
71100
Fork
55581
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
6d9c6e9c
编写于
7月 19, 2016
作者:
V
Vadim Pisarevsky
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #6805 from sergarrido:sergarrido-fix-useextrinsicguess
上级
744f9078
e5d12502
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
46 addition
and
10 deletion
+46
-10
modules/calib3d/src/solvepnp.cpp
modules/calib3d/src/solvepnp.cpp
+46
-10
未找到文件。
modules/calib3d/src/solvepnp.cpp
浏览文件 @
6d9c6e9c
...
...
@@ -53,17 +53,36 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints,
Mat
opoints
=
_opoints
.
getMat
(),
ipoints
=
_ipoints
.
getMat
();
int
npoints
=
std
::
max
(
opoints
.
checkVector
(
3
,
CV_32F
),
opoints
.
checkVector
(
3
,
CV_64F
));
CV_Assert
(
npoints
>=
0
&&
npoints
==
std
::
max
(
ipoints
.
checkVector
(
2
,
CV_32F
),
ipoints
.
checkVector
(
2
,
CV_64F
))
);
_rvec
.
create
(
3
,
1
,
CV_64F
);
_tvec
.
create
(
3
,
1
,
CV_64F
);
Mat
cameraMatrix
=
_cameraMatrix
.
getMat
(),
distCoeffs
=
_distCoeffs
.
getMat
();
Mat
rvec
,
tvec
;
if
(
flags
!=
CV_ITERATIVE
)
useExtrinsicGuess
=
false
;
if
(
useExtrinsicGuess
)
{
int
rtype
=
_rvec
.
type
(),
ttype
=
_tvec
.
type
();
Size
rsize
=
_rvec
.
size
(),
tsize
=
_tvec
.
size
();
CV_Assert
(
(
rtype
==
CV_32F
||
rtype
==
CV_64F
)
&&
(
ttype
==
CV_32F
||
ttype
==
CV_64F
)
);
CV_Assert
(
(
rsize
==
Size
(
1
,
3
)
||
rsize
==
Size
(
3
,
1
))
&&
(
tsize
==
Size
(
1
,
3
)
||
tsize
==
Size
(
3
,
1
))
);
}
else
{
_rvec
.
create
(
3
,
1
,
CV_64F
);
_tvec
.
create
(
3
,
1
,
CV_64F
);
}
rvec
=
_rvec
.
getMat
();
tvec
=
_tvec
.
getMat
();
if
(
flags
==
CV_EPNP
)
{
cv
::
Mat
undistortedPoints
;
cv
::
undistortPoints
(
ipoints
,
undistortedPoints
,
cameraMatrix
,
distCoeffs
);
epnp
PnP
(
cameraMatrix
,
opoints
,
undistortedPoints
);
cv
::
Mat
R
,
rvec
=
_rvec
.
getMat
(),
tvec
=
_tvec
.
getMat
()
;
cv
::
Mat
R
;
PnP
.
compute_pose
(
R
,
tvec
);
cv
::
Rodrigues
(
R
,
rvec
);
return
true
;
...
...
@@ -75,7 +94,7 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints,
cv
::
undistortPoints
(
ipoints
,
undistortedPoints
,
cameraMatrix
,
distCoeffs
);
p3p
P3Psolver
(
cameraMatrix
);
cv
::
Mat
R
,
rvec
=
_rvec
.
getMat
(),
tvec
=
_tvec
.
getMat
()
;
cv
::
Mat
R
;
bool
result
=
P3Psolver
.
solve
(
R
,
tvec
,
opoints
,
undistortedPoints
);
if
(
result
)
cv
::
Rodrigues
(
R
,
rvec
);
...
...
@@ -85,7 +104,7 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints,
{
CvMat
c_objectPoints
=
opoints
,
c_imagePoints
=
ipoints
;
CvMat
c_cameraMatrix
=
cameraMatrix
,
c_distCoeffs
=
distCoeffs
;
CvMat
c_rvec
=
_rvec
.
getMat
(),
c_tvec
=
_tvec
.
getMat
()
;
CvMat
c_rvec
=
rvec
,
c_tvec
=
tvec
;
cvFindExtrinsicCameraParams2
(
&
c_objectPoints
,
&
c_imagePoints
,
&
c_cameraMatrix
,
c_distCoeffs
.
rows
*
c_distCoeffs
.
cols
?
&
c_distCoeffs
:
0
,
&
c_rvec
,
&
c_tvec
,
useExtrinsicGuess
);
...
...
@@ -316,10 +335,26 @@ void cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints,
CV_Assert
(
ipoints
.
depth
()
==
CV_32F
||
ipoints
.
depth
()
==
CV_64F
);
CV_Assert
((
ipoints
.
rows
==
1
&&
ipoints
.
channels
()
==
2
)
||
ipoints
.
cols
*
ipoints
.
channels
()
==
2
);
_rvec
.
create
(
3
,
1
,
CV_64FC1
);
_tvec
.
create
(
3
,
1
,
CV_64FC1
);
Mat
rvec
=
_rvec
.
getMat
();
Mat
tvec
=
_tvec
.
getMat
();
Mat
rvec
,
tvec
;
if
(
flags
!=
CV_ITERATIVE
)
useExtrinsicGuess
=
false
;
if
(
useExtrinsicGuess
)
{
int
rtype
=
_rvec
.
type
(),
ttype
=
_tvec
.
type
();
Size
rsize
=
_rvec
.
size
(),
tsize
=
_tvec
.
size
();
CV_Assert
(
(
rtype
==
CV_32F
||
rtype
==
CV_64F
)
&&
(
ttype
==
CV_32F
||
ttype
==
CV_64F
)
);
CV_Assert
(
(
rsize
==
Size
(
1
,
3
)
||
rsize
==
Size
(
3
,
1
))
&&
(
tsize
==
Size
(
1
,
3
)
||
tsize
==
Size
(
3
,
1
))
);
}
else
{
_rvec
.
create
(
3
,
1
,
CV_64F
);
_tvec
.
create
(
3
,
1
,
CV_64F
);
}
rvec
=
_rvec
.
getMat
();
tvec
=
_tvec
.
getMat
();
Mat
objectPoints
=
opoints
.
reshape
(
3
,
1
),
imagePoints
=
ipoints
.
reshape
(
2
,
1
);
...
...
@@ -360,7 +395,8 @@ void cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints,
Mat
colInlierObjectPoints
=
inlierObjectPoints
(
Rect
(
i
,
0
,
1
,
1
));
objectPoints
.
col
(
index
).
copyTo
(
colInlierObjectPoints
);
}
solvePnP
(
inlierObjectPoints
,
inlierImagePoints
,
params
.
camera
.
intrinsics
,
params
.
camera
.
distortion
,
localRvec
,
localTvec
,
false
,
flags
);
solvePnP
(
inlierObjectPoints
,
inlierImagePoints
,
params
.
camera
.
intrinsics
,
params
.
camera
.
distortion
,
localRvec
,
localTvec
,
params
.
useExtrinsicGuess
,
flags
);
}
localRvec
.
copyTo
(
rvec
);
localTvec
.
copyTo
(
tvec
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录