三维mesh算法合集


Eigen库函数与opencv/matlab

    • opencv与Eigen的交互:
    • Eigen 与 matlab函数的对应关系:
【三维mesh算法合集】
opencv与Eigen的交互:
#include #include #include #include using namespace std; using namespace cv; using namespace Eigen; void main() { Mat img = imread("jasen.jpg",CV_LOAD_IMAGE_GRAYSCALE); int row = img.rows; int col = img.cols; MatrixXd m(row, col); cv2eigen(img,m); return; }

#include #include #include #include using namespace std; using namespace cv; using namespace Eigen; void main() { Mat img; Matrix m ; m.fill(255); eigen2cv(m, img); return; }

Eigen 与 matlab函数的对应关系:
#include // 基本用法 // Eigen// Matlab// 注释 x.size()// length(x)// 向量的长度 C.rows()// size(C,1)// 矩阵的行数 C.cols()// size(C,2)// 矩阵的列数 x(i)// x(i+1)// 访问向量元素(Matlab的下标从1开始计数) C(i,j)// C(i+1,j+1)// 访问矩阵元素A << 1, 2, 3,// 初始化A,元素也可以是矩阵,先按列堆叠,再按行堆叠。 4, 5, 6, 7, 8, 9; B << A, A, A; // B 是3个A水平排列 A.fill(10); // 将A的所有元素填充为10// Eigen// Matlab注释 MatrixXd::Identity(rows,cols)// eye(rows,cols)//单位矩阵 C.setIdentity(rows,cols)// C = eye(rows,cols)//单位矩阵 MatrixXd::Zero(rows,cols)// zeros(rows,cols)//全零矩阵 C.setZero(rows,cols)// C = zeros(rows,cols)//全零矩阵 MatrixXd::Ones(rows,cols)// ones(rows,cols)//全一矩阵 C.setOnes(rows,cols)// C = ones(rows,cols)//全一矩阵 MatrixXd::Random(rows,cols)// rand(rows,cols)*2-1//MatrixXd::Random 返回范围为(-1, 1)的均匀分布的随机数 C.setRandom(rows,cols)// C = rand(rows,cols)*2-1//返回范围为(-1, 1)的均匀分布的随机数 VectorXd::LinSpaced(size,low,high)// linspace(low,high,size)'//返回size个等差数列,第一个数为low,最后一个数为high v.setLinSpaced(size,low,high)// v = linspace(low,high,size)' //返回size个等差数列,第一个数为low,最后一个数为high VectorXi::LinSpaced(((hi-low)/step)+1,// low:step:hi//以step为步长的等差数列。((hi-low)/step)+1为个数 low,low+step*(size-1))//// Matrix 切片和块。下面列出的所有表达式都是可读/写的。 // 使用模板参数更快(如第2个)。注意:Matlab是的下标是从1开始的。 // Eigen// Matlab// 注释 x.head(n)// x(1:n)//前n个元素 x.head()// x(1:n)//前n个元素 x.tail(n)// x(end - n + 1: end)//倒数n个元素 x.tail()// x(end - n + 1: end)//倒数n个元素 x.segment(i, n)// x(i+1 : i+n)//切片 x.segment(i)// x(i+1 : i+n)//切片 P.block(i, j, rows, cols)// P(i+1 : i+rows, j+1 : j+cols) //块 P.block(i, j)// P(i+1 : i+rows, j+1 : j+cols) //块 P.row(i)// P(i+1, :)//第i行 P.col(j)// P(:, j+1)//第j列 P.leftCols()// P(:, 1:cols)//前cols列 P.leftCols(cols)// P(:, 1:cols)//前cols列 P.middleCols(j)// P(:, j+1:j+cols)//中间cols列 P.middleCols(j, cols)// P(:, j+1:j+cols)//中间cols列 P.rightCols()// P(:, end-cols+1:end)//后cols列 P.rightCols(cols)// P(:, end-cols+1:end)//后cols列 P.topRows()// P(1:rows, :)//前rows行 P.topRows(rows)// P(1:rows, :)//前rows行 P.middleRows(i)// P(i+1:i+rows, :)//中间rows行 P.middleRows(i, rows)// P(i+1:i+rows, :)//中间rows行 P.bottomRows()// P(end-rows+1:end, :)//最后rows行 P.bottomRows(rows)// P(end-rows+1:end, :)//最后rows行 P.topLeftCorner(rows, cols)// P(1:rows, 1:cols)//左上角块 P.topRightCorner(rows, cols)// P(1:rows, end-cols+1:end)//右上角块 P.bottomLeftCorner(rows, cols)// P(end-rows+1:end, 1:cols)//左下角块 P.bottomRightCorner(rows, cols)// P(end-rows+1:end, end-cols+1:end) //右下角块 P.topLeftCorner()// P(1:rows, 1:cols)//左上角块 P.topRightCorner()// P(1:rows, end-cols+1:end)//右上角块 P.bottomLeftCorner()// P(end-rows+1:end, 1:cols)//左下角块 P.bottomRightCorner()// P(end-rows+1:end, end-cols+1:end) //右下角块// 特别说明:Eigen的交换函数进行了高度优化 // Eigen// Matlab R.row(i) = P.col(j); // R(i, :) = P(:, j) R.col(j1).swap(mat1.col(j2)); // R(:, [j1 j2]) = R(:, [j2, j1]) //交换列// Views, transpose, etc; // Eigen// Matlab R.adjoint()// R'// 共轭转置 R.transpose()// R.' or conj(R')// 可读/写 转置 R.diagonal()// diag(R)// 可读/写 对角元素 x.asDiagonal()// diag(x)// 对角矩阵化 R.transpose().colwise().reverse()// rot90(R)// 可读/写 逆时针旋转90度 R.rowwise().reverse()// fliplr(R)// 水平翻转 R.colwise().reverse()// flipud(R)// 垂直翻转 R.replicate(i,j)// repmat(P,i,j)// 复制矩阵,垂直复制i个,水平复制j个// 四则运算,和Matlab相同。但Matlab中不能使用*=这样的赋值运算符 // 矩阵 - 向量矩阵 - 矩阵矩阵 - 标量 y= M*x; R= P*Q; R= P*s; a= b*M; R= P - Q; R= s*P; a *= M; R= P + Q; R= P/s; R *= Q; R= s*P; R += Q; R *= s; R -= Q; R /= s; // 逐像素操作Vectorized operations on each element independently // Eigen// Matlab//注释 R = P.cwiseProduct(Q); // R = P .* Q//逐元素乘法 R = P.array() * s.array(); // R = P .* s//逐元素乘法(s为标量) R = P.cwiseQuotient(Q); // R = P ./ Q//逐元素除法 R = P.array() / Q.array(); // R = P ./ Q//逐元素除法 R = P.array() + s.array(); // R = P + s//逐元素加法(s为标量) R = P.array() - s.array(); // R = P - s//逐元素减法(s为标量) R.array() += s; // R = R + s//逐元素加法(s为标量) R.array() -= s; // R = R - s//逐元素减法(s为标量) R.array() < Q.array(); // R < Q//逐元素比较运算 R.array() <= Q.array(); // R <= Q//逐元素比较运算 R.cwiseInverse(); // 1 ./ P//逐元素取倒数 R.array().inverse(); // 1 ./ P//逐元素取倒数 R.array().sin()// sin(P)//逐元素计算正弦函数 R.array().cos()// cos(P)//逐元素计算余弦函数 R.array().pow(s)// P .^ s//逐元素计算幂函数 R.array().square()// P .^ 2//逐元素计算平方 R.array().cube()// P .^ 3//逐元素计算立方 R.cwiseSqrt()// sqrt(P)//逐元素计算平方根 R.array().sqrt()// sqrt(P)//逐元素计算平方根 R.array().exp()// exp(P)//逐元素计算指数函数 R.array().log()// log(P)//逐元素计算对数函数 R.cwiseMax(P)// max(R, P)//逐元素计算R和P的最大值 R.array().max(P.array())// max(R, P)//逐元素计算R和P的最大值 R.cwiseMin(P)// min(R, P)//逐元素计算R和P的最小值 R.array().min(P.array())// min(R, P)//逐元素计算R和P的最小值 R.cwiseAbs()// abs(P)//逐元素计算R和P的绝对值 R.array().abs()// abs(P)//逐元素计算绝对值 R.cwiseAbs2()// abs(P.^2)//逐元素计算平方 R.array().abs2()// abs(P.^2)//逐元素计算平方 (R.array() < s).select(P,Q ); // (R < s ? P : Q)//根据R的元素值是否小于s,选择P和Q的对应元素 R = (Q.array()==0).select(P,A) // R(Q==0) = P(Q==0) R(Q!=0) = P(Q!=0)//根据Q中元素等于零的位置选择P中元素 R = P.unaryExpr(ptr_fun(func)) // R = arrayfun(func, P)// 对P中的每个元素应用func函数// Reductions. int r, c; // Eigen// Matlab//注释 R.minCoeff()// min(R(:))//最小值 R.maxCoeff()// max(R(:))//最大值 s = R.minCoeff(&r, &c)// [s, i] = min(R(:)); [r, c] = ind2sub(size(R), i); //计算最小值和它的位置 s = R.maxCoeff(&r, &c)// [s, i] = max(R(:)); [r, c] = ind2sub(size(R), i); //计算最大值和它的位置 R.sum()// sum(R(:))//求和(所有元素) R.colwise().sum()// sum(R)//按列求和 R.rowwise().sum()// sum(R, 2) or sum(R')'//按行求和 R.prod()// prod(R(:))//累积 R.colwise().prod()// prod(R)//按列累积 R.rowwise().prod()// prod(R, 2) or prod(R')'//按行累积 R.trace()// trace(R)//迹 R.all()// all(R(:))//是否所有元素都非零 R.colwise().all()// all(R)//按列判断,是否该列所有元素都非零 R.rowwise().all()// all(R, 2)//按行判断,是否该行所有元素都非零 R.any()// any(R(:))//是否有元素非零 R.colwise().any()// any(R)//按列判断,是否该列有元素都非零 R.rowwise().any()// any(R, 2)//按行判断,是否该行有元素都非零// 点积,范数等 // Eigen// Matlab// 注释 x.norm()// norm(x).//范数(注意:Eigen中没有norm(R)) x.squaredNorm()// dot(x, x)//平方和(注意:对于复数而言,不等价) x.dot(y)// dot(x, y)//点积 x.cross(y)// cross(x, y)//交叉积,需要头文件 #include 类型转换 // Eigen// Matlab// 注释 A.cast(); // double(A)//变成双精度类型 A.cast(); // single(A)//变成单精度类型 A.cast(); // int32(A)//编程整型 A.real(); // real(A)//实部 A.imag(); // imag(A)//虚部 // 如果变换前后的类型相同,不做任何事情。// 注意:Eigen中,绝大多数的涉及多个操作数的运算都要求操作数具有相同的类型 MatrixXf F = MatrixXf::Zero(3,3); A += F; // 非法。Matlab中允许。(单精度+双精度) A += F.cast(); // 将F转换成double,并累加。(一般都是在使用时临时转换)// Eigen 可以将已存储数据的缓存 映射成 Eigen矩阵 float array[3]; Vector3f::Map(array).fill(10); // create a temporary Map over array and sets entries to 10 int data[4] = {1, 2, 3, 4}; Matrix2i mat2x2(data); // 将 data 复制到 mat2x2 Matrix2i::Map(data) = 2*mat2x2; // 使用 2*mat2x2 覆写data的元素 MatrixXi::Map(data, 2, 2) += mat2x2; // 将 mat2x2 加到 data的元素上 (当编译时不知道大小时,可选语法)

    推荐阅读