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的更多相关文章

  1. [LeetCode] Flatten 2D Vector 压平二维向量

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  2. Package gp in the OpenCASCADE

    Package gp in the OpenCASCADE eryar@163.com China 一.简介 Introduction to Package gp gp是几何处理程序包(Geometr ...

  3. C++ STL,list vector区别

    顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组.在创建一个 ...

  4. Flatten 2D Vector

    Implement an iterator to flatten a 2d vector. For example, Given 2d vector = [ [1,2], [3], [4,5,6] ] ...

  5. LeetCode Flatten 2D Vector

    原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...

  6. opencv基本的数据结构(转)

    DataType : 将C++数据类型转换为对应的opencv数据类型 enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, ...

  7. c++容器(vector、list、deque)

    vector ,deque 和 list 顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可 ...

  8. 边工作边刷题:70天一遍leetcode: day 84

    Flatten 2D Vector 要点: 这题是2d的iterator,一般对于1d的情况,hasNext()是不需要做移动的.而2d不同,core iterator是j向的,而i向要在hasNex ...

  9. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

随机推荐

  1. MyEclipse2014 优化设置

    1.指定本机java环境 Windows-->preferences-->java-->Insetallel JREs 右侧 单击ADD standard VM-->Next ...

  2. django多对多中间表详解

    我们都知道对于ManyToMany字段,Django采用的是第三张中间表的方式.通过这第三张表,来关联ManyToMany的双方.下面我们根据一个具体的例子,详细解说中间表的使用. 一.默认中间表 首 ...

  3. jQuery实时监听input的值变化(input的值产生变化才会触发事件)

    //用于监听input的值变化(input的值产生变化才会触发事件) (function ($) { $.fn.watch = function (callback) { return this.ea ...

  4. C++指针总结

    在C++中通过动态创建的对象,我们只能获得一个指针,并通过指针控制它.指针是存放对象的内存地址值,更准确的描述是对象的起始地址值.每一个指针都有一个相关的类型,不同数据类型的指针之间的区别不在指针的描 ...

  5. 编写自己的代码库(javascript常用实例的实现与封装)[转]

    1.前言 因为公司最近项目比较忙,没那么多空余的事件写文章了,所以这篇文章晚了几天发布.但是这也没什么关系,不过该来的,总是会来的.好了,其他的不多说的,大家在开发的时候应该知道,有很多常见的实例操作 ...

  6. mount ntfs-3g , fstab里的配置没有效果

    把ntfs-3g配置在 fstab 里,mount 时会报 No such device 网上也有在嵌入式系统里发生的类似例子. 没有解决方法,也不准备再研究了. 准备在机器启动之后,手动下面的命令 ...

  7. Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)

    大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...

  8. java使用HttpClient

    HttpClient常用的包有两个 org.apache.http.client以及org.apache.commons.httpclient 我常用的是org.apache.http.client. ...

  9. spring 监听器 IntrospectorCleanupListener

    org.springframework.web.util.IntrospectorCleanupListener监听器 主要负责处理由JavaBean Introspector使用而引起的缓冲泄露,  ...

  10. MySQL 事件跟踪器

    /*第一步 创建以下两个 日志表 */ CREATE TABLE `slow_log` ( `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMEST ...