vec2d
namespace :
cv::vec2d;
void src2ipm(cv::Mat &srcimage, cv::Mat& uvgrid, cv::Mat& outimage, cv::Mat& coord, cv::Size& sz, double ht, double roll, double pitch, double* camera_param_KK)
{ int height = (int)(ht*1000); //unit-mm.
double fx = camera_param_KK[0];
double fy = camera_param_KK[4];
double cx = camera_param_KK[2];
double cy = camera_param_KK[5]; double c1 = cos(pitch*PI / 180);
double s1 = sin(pitch*PI / 180);
double c2 = cos(roll*PI / 180);
double s2 = sin(roll*PI / 180); double means = cv::mean(srcimage).val[0]; outimage = cv::Mat::zeros(sz.height, sz.width, CV_64FC1);
coord = cv::Mat::zeros(sz.height, sz.width, CV_64FC2);// for (int i = 0; i < sz.height; i++)
{
for (int j = 0; j < sz.width; j++)
{
float ui = uvgrid.at<double>(0, i*sz.width + j);
float vi = uvgrid.at<double>(1, i*sz.width + j);
//cout << "vi: " << vi << endl;
if (ui<0 || ui>1278)
outimage.at<double>(i, j) = means / 255;
else
{
int x1 = (int)ui, x2 = (int)(ui + 1);
int y1 = (int)vi, y2 = (int)(vi + 1);
float x = ui - (float)x1;
float y = vi - (float)y1; double val = srcimage.at<uchar>(y1, x1)*(1 - x)*(1 - y) +
srcimage.at<uchar>(y1, x2)*x*(1 - y) +
srcimage.at<uchar>(y2, x1)*(1 - x)*y +
srcimage.at<uchar>(y1, x1)* x* y;
outimage.at<double>(i, j) = val/255;
//
coord.at<cv::Vec2d>(i, j)[1] =
height*(fy*s1 + cy*c1 - y1*c1) / (fy*c1 - cy*s1 + y1*s1)*(1 - y) +
height*(fy*s1 + cy*c1 - y2*c1) / (fy*c1 - cy*s1 + y2*s1)*y;
double y_w = coord.at<cv::Vec2d>(i, j)[1];
coord.at<cv::Vec2d>(i, j)[0] = (s1*y_w + height*c1)*(cx - x1) / fx; //Vec2d
}
}
}
outimage = outimage*255;
//cout << "coordinate.rows: " << coordinate_.rows << "--- coordinate.cols: " << coordinate_.cols << endl; //imshow("ipm", outimage);
//cv::waitKey(0);
//imwrite("./ipm.png", outimage);
}
cv::Mat temp = cv::Mat::ones(3, uv.cols, CV_64FC1);
void xyp2ipmp(cv::Mat& xyp, cv::Mat& ipmp, cv::Mat& xylim, Size sz){
	//xylimist_[0]-latteral/xylimist_[1]-longitudinal...
	//ipmp-row0-cols-latteral/ipmp-row1-rows-longitudinal...
	std::cout << "start probp2ipmp: " << std::endl;
	double xmin = 0, xmax = 0, ymin = 0, ymax = 0;
	minMaxLoc(xylim.row(0), &xmin, &xmax);
	minMaxLoc(xylim.row(1), &ymin, &ymax);
	double stepcol = (xmax - xmin) / sz.width;
	double steprow = (ymax - ymin) / sz.height;
	cv::Mat tempx = cv::Mat::ones(1, xyp.cols, CV_64FC1) * xmin;
	cv::Mat tempy = cv::Mat::ones(1, xyp.cols, CV_64FC1) * ymax;
	ipmp = cv::Mat::zeros(2, xyp.cols, CV_8UC1);
	ipmp.rowRange(0, 1) = ( xyp.rowRange(0, 1) - tempx ) / stepcol;
	ipmp.rowRange(1, 2) = ( tempy - xyp.rowRange(1, 2) ) / steprow;
}
save image:
char output_path[100];
sprintf(output_path,"./ipmp/00000%05d.png",cnt);
		cv::imwrite(output_path, ipm3);
vec2d的更多相关文章
- [LeetCode] Flatten 2D Vector 压平二维向量
		
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
 - Package gp in the OpenCASCADE
		
Package gp in the OpenCASCADE eryar@163.com China 一.简介 Introduction to Package gp gp是几何处理程序包(Geometr ...
 - C++ STL,list vector区别
		
顺序性容器: 向量 vector : 是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组.在创建一个 ...
 - Flatten 2D Vector
		
Implement an iterator to flatten a 2d vector. For example, Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
 - LeetCode Flatten 2D Vector
		
原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...
 - opencv基本的数据结构(转)
		
DataType : 将C++数据类型转换为对应的opencv数据类型 enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, ...
 - c++容器(vector、list、deque)
		
vector ,deque 和 list 顺序性容器: 向量 vector : 是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可 ...
 - 边工作边刷题:70天一遍leetcode: day 84
		
Flatten 2D Vector 要点: 这题是2d的iterator,一般对于1d的情况,hasNext()是不需要做移动的.而2d不同,core iterator是j向的,而i向要在hasNex ...
 - opencv3中的机器学习算法之:EM算法
		
不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...
 
随机推荐
- [原][译][physX]phsyX3.3.4官方文档物理引擎基本概念和例子介绍
			
世界和物体: 物理世界包括集合的场景,每个包含的物体称为演员(Actors) 每个场景(Scene)都定义了自己的参考框架包含了所有的时间和空间 在不同的场景,演员不互相影响 演员通常有三种类型:刚体 ...
 - MySQL数据库性能优化
			
mysql查询优化: 1.新增字段索引,查询时若使用到or关键字,则两个字段都需建立索引才能生效 2.sql语句包含子查询,mysql会创建临时表查询结束后删除,影响效率,所以应尽可能使用join替代 ...
 - 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化
			
前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...
 - windows7 asp.net发布IIS 拒绝访问 解决方法
			
在windows7中打开DNN网站有以下问题: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP ...
 - Java实例-坦克大战
			
Java实例-坦克大战 一.样例图片 二.类图结构 坦克大战中的所有类 类的关系图 我的坦克类 三.说明 1.每一个新的独立运行的东西就是一个线程,像我方坦克,像敌方坦克,像所有的子弹 2.每一个线程 ...
 - spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
			
spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...
 - English trip -- VC(情景课) 7 C How much are the shose? 鞋多少钱
			
Grammar focus 语法点: How much is ...? How much are...? How much is the shirt? $15.99. How much are ...
 - Confluence 6 从 Crowd 或 JIRA 应用中切换回使用内部用户管理
			
如果你的 Confluence 站点当前使用的是 Crowd 或者 Jira 应用程序管理你的用的话,你可以按照下面的步骤切换使用回内部目录管理你的用户. 如果你的 Confluence 站点只有少量 ...
 - python-day33--Process类中的方法及属性
			
p.daemon = True -->守护进程,守护进程不可以再有子进程,并且主进程死守护进程就死,要写在p.start()之前 p.join() ---> 主进程等子进程执行完 之后再结 ...
 - ccf窗口
			
#include<iostream> #include<cstring> #include<algorithm> #include<vector> us ...