opecv c++计算图像的曲率

公式

κ = z x x ⋅ z y 2 − 2 ⋅ z x ⋅ z y ⋅ z x y + z y y ⋅ z x 2 ( z x 2 + z y 2 + 1 ) 3 / 2 \kappa = \frac{z_{xx} \cdot z_y^2 - 2 \cdot z_x \cdot z_y \cdot z_{xy} + z_{yy} \cdot z_x^2}{(z_x^2 + z_y^2 + 1)^{3/2}}\newline κ=(zx2+zy2+1)3/2zxx⋅zy2−2⋅zx⋅zy⋅zxy+zyy⋅zx2

其中:
z x = ∂ z ∂ x z_x = \frac{\partial z}{\partial x}\newline zx=∂x∂z
z y = ∂ z ∂ y z_y = \frac{\partial z}{\partial y}\newline zy=∂y∂z
z x x , z y y , z x y z_{xx}, z_{yy}, z_{xy} zxx,zyy,zxy 分别为 ( z ) 关于 ( x ) 和 ( y ) 的二阶导数和交叉导数。

代码

cpp 复制代码
void computeCurvature(const cv::Mat& depth_map, cv::Mat& curvature_map)
{
	cv::Mat gradient_x, gradient_y;
	cv::Mat gradient_xx, gradient_yy, gradient_xy;

	// 计算一阶导数
	Sobel(depth_map, gradient_x, CV_64F, 1, 0, 3);
	Sobel(depth_map, gradient_y, CV_64F, 0, 1, 3);

	// 计算二阶导数
	Sobel(gradient_x, gradient_xx, CV_64F, 1, 0, 3);
	Sobel(gradient_y, gradient_yy, CV_64F, 0, 1, 3);
	Sobel(gradient_x, gradient_xy, CV_64F, 0, 1, 3);

	// 计算曲率
	cv::Mat denominator = gradient_x.mul(gradient_x) + gradient_y.mul(gradient_y) + 
		cv::Mat::ones(depth_map.size(), CV_64F);
	cv::pow(denominator, 1.5, denominator);

	curvature_map = (gradient_xx.mul(gradient_y.mul(gradient_y)) - 2.0 * gradient_x.mul(gradient_y.mul(gradient_xy)) + gradient_yy.mul(gradient_x.mul(gradient_x))) / denominator;
}
相关推荐
旖旎夜光36 分钟前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
apcipot_rain11 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60511 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67811 小时前
深挖C++:类和对象(中)
开发语言·c++
LongRunning13 小时前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
D e re k ZH14 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
xiaoye-duck15 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai100715 小时前
【Effective Modern C++】学习第一章
c++
Fruiticecake16 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
青少儿编程课堂16 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛