- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Opencv-Python图像透视变换cv2.warpPerspective的示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
opencv-python图像透视变换cv2.warpperspective 。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# -*- coding:utf-8 -*-
import
cv2
import
numpy as np
import
sys
img
=
cv2.imread(
'test.jpg'
)
# cv2.imshow("original", img)
# 可选,扩展图像,保证内容不超出可视范围
img
=
cv2.copymakeborder(img,
200
,
200
,
200
,
200
, cv2.border_constant,
0
)
w, h
=
img.shape[
0
:
2
]
anglex
=
0
angley
=
30
anglez
=
0
# 是旋转
fov
=
42
r
=
0
def
rad(x):
return
x
*
np.pi
/
180
def
get_warpr():
global
anglex,angley,anglez,fov,w,h,r
# 镜头与图像间的距离,21为半可视角,算z的距离是为了保证在此可视角度下恰好显示整幅图像
z
=
np.sqrt(w
*
*
2
+
h
*
*
2
)
/
2
/
np.tan(rad(fov
/
2
))
# 齐次变换矩阵
rx
=
np.array([[
1
,
0
,
0
,
0
],
[
0
, np.cos(rad(anglex)),
-
np.sin(rad(anglex)),
0
],
[
0
,
-
np.sin(rad(anglex)), np.cos(rad(anglex)),
0
, ],
[
0
,
0
,
0
,
1
]], np.float32)
ry
=
np.array([[np.cos(rad(angley)),
0
, np.sin(rad(angley)),
0
],
[
0
,
1
,
0
,
0
],
[
-
np.sin(rad(angley)),
0
, np.cos(rad(angley)),
0
, ],
[
0
,
0
,
0
,
1
]], np.float32)
rz
=
np.array([[np.cos(rad(anglez)), np.sin(rad(anglez)),
0
,
0
],
[
-
np.sin(rad(anglez)), np.cos(rad(anglez)),
0
,
0
],
[
0
,
0
,
1
,
0
],
[
0
,
0
,
0
,
1
]], np.float32)
r
=
rx.dot(ry).dot(rz)
# 四对点的生成
pcenter
=
np.array([h
/
2
, w
/
2
,
0
,
0
], np.float32)
p1
=
np.array([
0
,
0
,
0
,
0
], np.float32)
-
pcenter
p2
=
np.array([w,
0
,
0
,
0
], np.float32)
-
pcenter
p3
=
np.array([
0
, h,
0
,
0
], np.float32)
-
pcenter
p4
=
np.array([w, h,
0
,
0
], np.float32)
-
pcenter
dst1
=
r.dot(p1)
dst2
=
r.dot(p2)
dst3
=
r.dot(p3)
dst4
=
r.dot(p4)
list_dst
=
[dst1, dst2, dst3, dst4]
org
=
np.array([[
0
,
0
],
[w,
0
],
[
0
, h],
[w, h]], np.float32)
dst
=
np.zeros((
4
,
2
), np.float32)
# 投影至成像平面
for
i
in
range
(
4
):
dst[i,
0
]
=
list_dst[i][
0
]
*
z
/
(z
-
list_dst[i][
2
])
+
pcenter[
0
]
dst[i,
1
]
=
list_dst[i][
1
]
*
z
/
(z
-
list_dst[i][
2
])
+
pcenter[
1
]
warpr
=
cv2.getperspectivetransform(org, dst)
return
warpr
def
control():
global
anglex,angley,anglez,fov,r
# 键盘控制
if
27
=
=
c:
# esc quit
sys.exit()
if
c
=
=
ord
(
'w'
):
anglex
+
=
1
if
c
=
=
ord
(
's'
):
anglex
-
=
1
if
c
=
=
ord
(
'a'
):
angley
+
=
1
print
(angley)
# dx=0
if
c
=
=
ord
(
'd'
):
angley
-
=
1
if
c
=
=
ord
(
'u'
):
anglez
+
=
1
if
c
=
=
ord
(
'p'
):
anglez
-
=
1
if
c
=
=
ord
(
't'
):
fov
+
=
1
if
c
=
=
ord
(
'r'
):
fov
-
=
1
if
c
=
=
ord
(
' '
):
anglex
=
angley
=
anglez
=
0
if
c
=
=
ord
(
'e'
):
print
(
"======================================"
)
print
(
'rotation matrix:'
)
print
(r)
print
(
'angle alpha(anglex):'
)
print
(anglex)
print
(
'angle beta(angley):'
)
print
(angley)
print
(
'dz(anglez):'
)
print
(anglez)
while
true:
warpr
=
get_warpr()
result
=
cv2.warpperspective(img, warpr, (h, w))
cv2.namedwindow(
'result'
,
2
)
cv2.imshow(
"result"
, result)
c
=
cv2.waitkey(
30
)
control()
cv2.destroyallwindows()
|
运行效果:
控制:
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持。如果你想了解更多相关内容请查看下面相关链接 。
原文链接:https://blog.csdn.net/dcrmg/article/details/80273818 。
最后此篇关于Opencv-Python图像透视变换cv2.warpPerspective的示例的文章就讲到这里了,如果你想了解更多关于Opencv-Python图像透视变换cv2.warpPerspective的示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我到处都找了很多,找不到我的问题的答案。我试图从这个线程复制一个文本检测软件(Extracting text OpenCV)但是在代码的末尾有一条消息错误说没有匹配的矩形,即使我已经在上面绘制了一个并
我已经彻底搜索过,但没有找到直接的答案。 将 opencv 矩阵 (cv::Mat) 作为参数传递给函数,我们传递的是智能指针。我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵。 我读
在我的应用程序中,我有一个通过引用接收 cv::Mat 对象的函数。这是函数的声明: void getChains(cv::Mat &img,std::vector &chains,cv::
我正在使用 Qt 编写一个 GUI 程序,并使用 OpenCV 进行一些视频处理。我在主 GUI 线程的标签中显示 OpenCV 进程(在单独的线程中)的结果。 我遇到的问题是 cv::waitKey
Mat a = (Mat_(3,3) = 2 int dims; //! the number of rows and columns or (-1, -1) when the arr
我尝试运行下面的代码,但出现错误。我正在为名为“Mat::at”的 OpenCV 函数创建一个包装器,并尝试使用“G++”将其编译为 Ubuntu Trusty 上的“.so”。我在下面列出了“.cp
我在 C# 中使用 EmguCV,当我想从网络摄像头抓取帧时遇到问题,语句中出现红色下划线: imgOrg = capturecam.QueryFrame(); error: Cannot impli
我正在尝试从另外两个矩阵生成一个 cv::Mat C,以便获得第三个矩阵,该矩阵由通过组合矩阵 A 和 B 的一维点生成的二维点构成。 我的问题是,我尝试的所有操作都只是连接矩阵,并没有真正将每个点与
我用 cv.imread在 python 中读取 png 文件。然后当我使用 cv.imwrite立即保存图像的功能我然后发现图像中的颜色略有变化。我正在尝试在此图像上执行字符识别,而 OCR 在 p
我尝试将 cv::bitwise_not 转换为 double 值的 cv::Mat 矩阵。我申请了 cv::bitwise_not(img, imgtemp); img是0和1的CV_64F数据。但
我正在尝试使用函数 cv.glmnet 找到最佳的 lambda(使用 RIDGE 回归)以预测某些对象的归属类别。所以我使用的代码是: CVGLM<-cv.glmnet(x,y,nfolds=34,
我有这个方法: static void WriteMatVect(const std::string& filename, const std::vector& mats); ... void Fil
下面的转换是我想要做的。 对于源图像中的每个图 block ,我知道每个角的坐标,并且我知道输出图像中每个对应角的坐标,所以我可以调用 cvWarpPerspective 扭曲每个图 block ,然
我必须在C++ / CLI中的托管和非托管代码中都使用OpenCV。 我正在尝试在托管代码中使用Emgu CV来包装OpenCV对象,但是在进行转换时遇到了麻烦。 我该怎么做: Emgu::CV::M
我正在尝试在 cv::Mat 中使用 CV_32FC4,以便它存储 RGBA32 图像。但是当我使用 cv::imwrite 将其保存为 png 文件时,结果文件始终是一个空图像。 例如,我创建了这样
无法在 VS 2017 中设置 OpenCV。我做错了什么?是的,我已将所有其他帖子设为红色。 代码: #include "opencv2/highgui/highgui.hpp" u
我有两个(相同大小,相同类型)cv:Mat 让我们称它们为 A,B。我还有另一个 cv::Mat,它是一个掩码(0 和 1 值或其他值,0 和 255 也适用)让我们称它为 M。 我需要构造一个新的
使用 OpenCV 中实现的 Scalar 类,我不明白这段代码有什么区别: Mat test; test = Scalar::all(0); 还有这个: Mat test = Scalar::all
我对这行代码感到困惑: cv::Mat_::iterator 我知道 Mat_ 属于 cv 命名空间和 vec3b 也。但是之后的最后一个 :: 操作符和 iterator 让我感到困惑!它也属于 c
我想优雅地将 Mat 转换为 Vec3f。目前我是这样做的: Mat line; Vec3f ln; ln[0] = line.
我是一名优秀的程序员,十分优秀!