gpt4 book ai didi

C++函数优化

转载 作者:可可西里 更新时间:2023-11-01 18:35:31 25 4
gpt4 key购买 nike

我有一个函数如下,它被多次调用,导致我的程序运行缓慢。有什么办法可以优化吗?例如,使用 SIMD 指令或其他技术。 getray() 函数用于从预先计算的查找表中检索给定 vector-2 查询的 vector-3。它是在 Visual-studio-2013 中编译的,目标配置是 x64 机器。

顺便说一下,多次调用此函数的 for 循环已经使用 OpenMP 进行了优化。

非常感谢。

bool warpPlanarHomography(
const Eigen::Matrix3d& H_camera2_camera1
, const cv::Mat& image1
, const cv::Mat& image2
, FisheyeCameraUnified& cam1
, FisheyeCameraUnified& cam2
, const Eigen::Vector2i& patchCenter
, const int patchSize
, Eigen::Matrix<unsigned char, 7, 7>& patch1)
{
const int patchSize_2 = 3;
for (int v = 0; v < patchSize; ++v) // row
{
for (int u = 0; u < patchSize; ++u)
{
Eigen::Vector2i p1 = Eigen::Vector2i(u - patchSize_2, v - patchSize_2).cast<int>() + patchCenter;

if (p1(0, 0) < 0 || p1(1, 0) < 0 || p1(0, 0) >= image1.cols || p1(1, 0) >= image1.rows) return false;

Eigen::Vector3d ray1;
cam1.getRay(p1(1, 0), p1(0, 0), ray1);
Eigen::Vector2d p2;
if (!cam2.project(H_camera2_camera1 * ray1, p2))
{
return false;
}
if (p2.x() < 0.0 || p2.x() >= image2.cols - 1 ||
p2.y() < 0.0 || p2.y() >= image2.rows - 1)
{
return false;
}
getInterpolatedPixel(image2, p2, &patch1(v, u));
}
}
return true;
}

,其中项目函数如下所示

bool FisheyeCameraUnified::project(const Eigen::Vector3d& ray, Eigen::Vector2d& pt)
{
double fx, fy, cx, cy, xi;
fx = m_K(0, 0);
fy = m_K(1, 1);
cx = m_K(0, 2);
cy = m_K(1, 2);
xi = m_xi;

double d = ray.norm();
double rz = 1.0 / (ray(2) + xi * d);

// Project the scene point to the normalized plane.
Eigen::Vector2d m_d(ray(0) * rz, ray(1) * rz);

// Apply the projection matrix.
pt(0) = fx * m_d(0) + cx;
pt(1) = fy * m_d(1) + cy;
return true;
}

和getInterpolatedPixel()函数如下

void getInterpolatedPixel(const cv::Mat& image, const Eigen::Vector2d& coords, unsigned char* pixel)
{
int ix = static_cast<int>(coords.x());
int iy = static_cast<int>(coords.y());
double dx = coords.x() - ix;
double dy = coords.y() - iy;
double dxdy = dx * dy;

const double w00 = 1.0 - dx - dy + dxdy;
const double w01 = dx - dxdy;
const double w10 = dy - dxdy;
const double w11 = dxdy;

const unsigned char* p00 = image.data + iy * image.step.p[0] + ix * image.channels();
const unsigned char* p01 = p00 + image.channels();
const unsigned char* p10 = p00 + image.step.p[0];
const unsigned char* p11 = p10 + image.channels();

for (int i = 0; i < image.channels(); ++i)
{
double value = w11 * p11[i] + w10 * p10[i] + w01 * p01[i] + w00 * p00[i];
pixel[i] = cv::saturate_cast<unsigned char>(value);
}
}

最佳答案

  1. 测量瓶颈在哪里并首先尝试优化那个地方
  2. 你能用float吗?而不是 double
  3. 什么是m_K(0, 0) , m_K(1, 1) ...你能用常量代替吗
  4. 展开for (int i = 0; i < image.channels(); ++i)如果图像只能有特定数量的 channel (1、3、4 是典型数字),则循环
  5. 调用image.channels()仅一次,稍后使用储值
  6. 尝试添加inline小函数的修饰符

关于C++函数优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com