网友提问(透视变化)

您好:

我在网上看到您的opencv透视变换的博客,https://www.cnblogs.com/jsxyhelu/p/4219564.html

我是opencv小菜鸟一个,现在想要得到一个图片变形之后保存,整个图片信息不丢失,即四个角的信息不丢失应该怎么做?原图中某一点在新图中坐标应该怎么计算?万望不吝赐教,不胜感激,万分感谢。

你好:

我按照您的代码和网上找到的python代码(https://blog.csdn.net/fengxueniu/article/details/77964375)修改并实现的基本的透视变换,但基本原理是将原图test0.png加边界,边界值与透视之后的背景一致,是图片看起来信息为丢失。但图像旋转之后的预期效果如test1.png所示,而实际生成的图片如test2.png所示,现在想要实现从test0.png到test1.png的变换并求test0.png图中某一点坐标值在test1.png中位置,应该怎么做?对于透视变换不是特别理解。万望不吝赐教,万分感谢。

图片与代码附注如下。

   =》 

现有代码

#-*- coding:utf-8 -*-

#-*- coding:utf-8 -*-

import cv2

import numpy as np

import random

def rad(x):

return x*np.pi/180

img = cv2.imread("test0.png")

cv2.imshow("original", img)

#扩展图像,保证内容不超出可视范围

img = cv2.copyMakeBorder(img,100,100,100,100,cv2.BORDER_CONSTANT,(255, 255, 255))

w,h=img.shape[0:2]

cv2.imshow("original1", img)

#anglex=45

#angley = 45

#anglez = 0

#fov = 42

anglex=random.uniform(30,60)

angley =random.uniform(30,60)

anglez =random.uniform(30,60)

fov = random.uniform(30,60)

print(anglex,angley,anglez,fov)

#镜头与图像间的距离,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(anglex*np.pi/180), -np.sin(anglex*np.pi/180), 0],

[0, -np.sin(anglex*np.pi/180), np.cos(anglex*np.pi/180), 0,],

[0, 0, 0, 1]], np.float32)

ry = np.array([[np.cos(angley*np.pi/180), 0, np.sin(angley*np.pi/180), 0],

[0, 1, 0, 0],

[-np.sin(angley*np.pi/180),0, np.cos(angley*np.pi/180), 0,],

[0, 0, 0, 1]], np.float32)

rz = np.array([[np.cos(anglez*np.pi/180), np.sin(anglez*np.pi/180), 0, 0],

[-np.sin(anglez*np.pi/180), np.cos(anglez*np.pi/180), 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)

print(org)

print(dst)

result = cv2.warpPerspective(img, warpR, (h,w),(0,255,0))

print(result.shape)

cv2.imshow("result", result)

cv2.imencode(‘.png‘,result)[1].tofile(‘test2.png‘)

c=cv2.waitKey(0)

cv2.destroyAllWindows()

这个问题的出现,在于对透视变化原理的理解;可能还有一些调试的技巧。

int _tmain(int argc, _TCHAR* argv[])

{

Mat src  = imread("E:/sandbox/test0.png");

copyMakeBorder(src,src,10,10,10,10,BORDER_CONSTANT);

if (!src.data)

return 0;

vector<Point> not_a_rect_shape;

not_a_rect_shape.push_back(Point(10,10));

not_a_rect_shape.push_back(Point(74,10));

not_a_rect_shape.push_back(Point(74,77));

not_a_rect_shape.push_back(Point(10,77));

cv::Point2f src_vertices[4];

src_vertices[0] = not_a_rect_shape[0];

src_vertices[1] = not_a_rect_shape[1];

src_vertices[2] = not_a_rect_shape[2];

src_vertices[3] = not_a_rect_shape[3];

Point2f dst_vertices[4];

dst_vertices[0] = Point(0, 10);

dst_vertices[1] = Point(64,0);

dst_vertices[2] = Point(84,77);

dst_vertices[3] = Point(10,87);

Mat warpMatrix = getPerspectiveTransform(src_vertices, dst_vertices);

cv::Mat rotated;

warpPerspective(src, rotated, warpMatrix, rotated.size(), INTER_LINEAR, BORDER_CONSTANT);

// Display the image

cv::namedWindow( "Original Image");

cv::imshow( "Original Image",src);

cv::namedWindow( "warp perspective");

cv::imshow( "warp perspective",rotated);

cv::waitKey();

return 0;

}

结果:

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/jsxyhelu/p/9084789.html

时间: 2024-10-20 22:33:42

网友提问(透视变化)的相关文章

Jerry答网友提问:SAP CRM WebClient UI里的EXT,STRUCT等含义

2020年,Jerry会做一个新的尝试,选择部分朋友向我提出的问题,在公众号,知识星球或者微信圈子这些平台上公开回答,这样或许能帮助到更多的朋友. 具体说明参见我前一篇文章:2020年关于SAP知识问答的一个新的尝试 网友的提问: Jerry的解答: 以上截图是CRM系统里BSP_WD_CPMWB这个事务码进入之后,任意打开一个上下文节点(Context Node)看到的信息: STRUCT的含义? 在Jerry之前的文章 Jerry的WebClient UI 42篇原创文章合集 提到这样一张图

opencv学习--透视变化

透视变换和仿射变换具有很大的相同特性,前面提到了放射变化,这里再次把它拿出和透视变换进行比较 1 #include"cv.h" 2 #include"highgui.h" 3 using namespace cv; 4 void WarpPerspective(IplImage *img); 5 void WarpFangshe(IplImage *img); 6 int main() 7 { 8 IplImage *getimg = cvLoadImage(&qu

网友提问—孔洞提取

最近有网友咨询相关算法问题,我给了一些帮助,觉得比较典型,在经过他允许后将相关资料和思路进行整理,放出来大家共同学习! 一.问题: 图中这个孔是两个半圆加直线组成的,不同于普通的圆和椭圆,所以用hough变换检测效果不好,有没有什么方法可以把那个孔的轮廓给提取出来? 二.分析和解体:    如果对hough的原理和使用比较了解的话(可以翻看<学习OpenCV>),就知道想利用houghcircle取出这样的轮廓使不可能的,此类问题首先是要把关键区域强化出来,然后可以考虑轮廓分析的方法. 基于基

【转】如何在Qt 4程序中优化布局结构-兼回答网友提问

在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个确定的布局中.但在某些情况下,由此形成的布局看起来可能还不是我们最想要的形式.在这些情形中,可以通过改变要摆放的窗口部件的大小策略和大小提示来调整布局. 1.大小提示(size hint)和最小大小提示(minimum size hint) 在介绍Qt窗口部件的大小策略之前,首先介绍大小提示(size hint)和最小大小提示(minimum size hint). ⑴ 大小提示 大小提示是Qt为一个窗口部件推荐的尺寸.当Qt GUI

如何在Qt 4程序中优化布局结构-兼回答网友提问(转帖)

在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个确定的布局中.但在某些情况下,由此形成的布局看起来可能还不是我们最想要的形式.在这些情形中,可以通过改变要摆放的窗口部件的大小策略和大小提示来调整布局. 1.大小提示(size hint)和最小大小提示(minimum size hint) 在介绍Qt窗口部件的大小策略之前,首先介绍大小提示(size hint)和最小大小提示(minimum size hint). ⑴ 大小提示 大小提示是Qt为一个窗口部件推荐的尺寸.当Qt GUI

调查:近7成受访网友买票还找黄牛

过年了,很多在外工作了一年的人们,随着乡愁的召唤,又开始了一年一度的大迁徙.南都联合大粤网发起的网络民调,有1141名网友参与调查.数据显示,今年春运,81.68%的返乡旅客依然选择乘坐火车.可是回家的路并不轻松,截至1月15日,依然还有89 .92%的人没有买到回家的火车票.与之对应的是,今年春运铁路12306网站首次施行提前60天购票,除夕从广州向全国各方向的火车票一经发售,就被抢购一空.如何才能买到回家的车票?数据给出的结论是,67.75%的受访网友是通过找黄牛才买到票的. 调查结果显示,

冯提莫上综艺节目又不好好穿衣服了,网友:胆子真大!

冯提莫上综艺节目又不好好穿衣服了,网友:胆子真大!https://travel.weibo.com/a/2309404227194841870073冯提莫上综艺节目又不好好穿衣服了,网友:胆子真大!https://weibo.com/p20180411Pp/2309404227194841870073冯提莫上综艺节目又不好好穿衣服了,网友:胆子真大!https://travel.weibo.com/a/2309404227194875458844冯提莫上综艺节目又不好好穿衣服了,网友:胆子真大!

我从事过的设计(文件夹)

我的工作:设计(解决方式) . 包含软件和硬件或由软件+硬件组成的系统 . 下面将介绍我几十年来从事过各种设计,包含为教学.科研和生产进行的设计.个人业余爱好设计,以及为社会或他人提供的义务设计,因这些设计都是为解决某个问题而思考出来的办法,所以也可称为解决方式. 设计包含软件和硬件,也有软硬一起构成的系统.硬件设计包含功能.逻辑.线路.PCB(印刷线路板).设备总体外形等,都要一一考虑,大都在上世纪60-70年代.80年代后都为软件系统设计,当中80年是在PDP11或VAX750等小型机上用F

为什么有些大公司技术弱爆了?

[转载自互联网 http://blog.jobbole.com/96190/ ] 本文整理自知乎上的同名讨论帖:<为什么有些大公司技术弱爆了?>,有网友提问: 今年年初,到一家互联网公司实习,该公司是国内行业龙头.不过技术和管理方面,却弱爆了. 那里的程序员,每天都在看邮件,查问题工单.这些问题,多半是他们设计不当,造成的.代码写的一团糟,全是复制粘贴,连作者都没改,大家普遍不写注释,也不格式化,代码歪歪扭扭. 一个项目里,httpclient竟然出现了四种.一种是该公司研发部写的,一种是老版