opecv c++计算图像的曲率
创始人
2024-11-13 20:39:40

公式

κ = 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 ) 的二阶导数和交叉导数。

代码

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; } 

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...