VS2010中error C2780: const _Ty &std::max(const _Ty &,const _Ty &,_Pr)

本文展示了一种使用C++标准库中的std::max函数替代直接比较变量的方法。通过一个简单的例子,即比较两个整数i和j并取较大值,演示了如何利用模板函数std::max来实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将int x = max(i,j);

改成

int x = (std::max<int>)(i,j);

上述代码报错E:\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\utility(186): warning C4244: &ldquo;初始化&rdquo;:&ldquo;_Ty&rdquo;转换到&ldquo;_Ty2&rdquo;,可能丢失数据 with [ _Ty=double ] and [ _Ty2=float ] mediapipe/examples/desktop/holistic_tracking/holistic_detect.cpp(50): note: 查看对正在编译的函数 模板 实例化&ldquo;std::pair&lt;const std::string,float&gt;::pair&lt;const char(&amp;)[9],double,0&gt;(_Other1,_Other2 &amp;&amp;) noexcept(false)&rdquo;的引用 with [ _Other1=const char (&amp;)[9], _Other2=double ] mediapipe/examples/desktop/holistic_tracking/holistic_detect.cpp(47): note: 查看对正在编译的函数 模板 实例化&ldquo;std::pair&lt;const std::string,float&gt;::pair&lt;const char(&amp;)[9],double,0&gt;(_Other1,_Other2 &amp;&amp;) noexcept(false)&rdquo;的引用 with [ _Other1=const char (&amp;)[9], _Other2=double ] E:\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\utility(43): error C2440: &ldquo;?&rdquo;: 无法从&ldquo;cv::MatExpr&rdquo;转换为&ldquo;bool&rdquo; E:\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\utility(43): note: 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符 mediapipe/examples/desktop/holistic_tracking/holistic_detect.cpp(119): note: 查看对正在编译的函数 模板 实例化&ldquo;const _Ty &amp;std::max&lt;cv::MatExpr&gt;(const _Ty &amp;,const _Ty &amp;) noexcept(false)&rdquo;的引用 with [ _Ty=cv::MatExpr ]
06-09
错误有错误 2 error C3861: &ldquo;accumulate&rdquo;: 找不到标识符 c:\users\sqpsk\desktop\小学期数据结构\consoleapplication8\consoleapplication8\consoleapplication8.cpp 85 1 ConsoleApplication8 错误 3 error C2664: &ldquo;std::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt;&gt;::basic_string(std::initializer_list&lt;_Elem&gt;,const std::allocator&lt;char&gt; &amp;)&rdquo;: 无法将参数 1 从&ldquo;char&rdquo;转换为&ldquo;const std::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt;&gt; &amp;&rdquo; c:\users\sqpsk\desktop\小学期数据结构\consoleapplication8\consoleapplication8\consoleapplication8.cpp 85 1 ConsoleApplication8 5 IntelliSense: &quot;TreeNode *&quot; 类型的值不能用于初始化 &quot;TreeNode *&quot; 类型的实体 c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 32 26 ConsoleApplication8 6 IntelliSense: &quot;TreeNode *&quot; 类型的值不能用于初始化 &quot;TreeNode *&quot; 类型的实体 c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 43 26 ConsoleApplication8 7 IntelliSense: 未定义标识符 &quot;accumulate&quot; c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 85 16 ConsoleApplication8 8 IntelliSense: &quot;TreeNode *&quot; 类型的值不能用于初始化 &quot;TreeNode *&quot; 类型的实体 c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 105 26 ConsoleApplication8 9 IntelliSense: &quot;TreeNode *&quot; 类型的值不能用于初始化 &quot;TreeNode *&quot; 类型的实体 c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 122 27 ConsoleApplication8 10 IntelliSense: &quot;TreeNode *&quot; 类型的值不能用于初始化 &quot;TreeNode *&quot; 类型的实体 c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 143 27 ConsoleApplication8 11 IntelliSense: 没有与参数列表匹配的 重载函数 &quot;std::vector&lt;_Ty, _Alloc&gt;::push_back [其中 _Ty=TreeNode *, _Alloc=std::allocator&lt;TreeNode *&gt;]&quot; 实例 参数类型为: (TreeNode *) 对象类型是: std::vector&lt;TreeNode *, std::allocator&lt;TreeNode *&gt;&gt; c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 187 23 ConsoleApplication8 12 IntelliSense: 操作数类型不兼容(&quot;TreeNode *&quot; 和 &quot;TreeNode *&quot;) c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 206 12 ConsoleApplication8 13 IntelliSense: &quot;TreeNode *&quot; 类型的值不能用于初始化 &quot;TreeNode *&quot; 类型的实体 c:\Users\sqpsk\Desktop\小学期数据结构\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 297 28 ConsoleApplication8
07-09
#include &lt;rclcpp/rclcpp.hpp&gt; #include &lt;cv_bridge/cv_bridge.h&gt; #include &lt;image_transport/image_transport.hpp&gt; #include &lt;tf2_ros/transform_broadcaster.h&gt; #include &lt;geometry_msgs/msg/transform_stamped.hpp&gt; #include &lt;opencv2/opencv.hpp&gt; #include &lt;Eigen/Dense&gt; #include &lt;opencv2/core.hpp&gt; #include &lt;opencv2/calib3d.hpp&gt; #include &lt;sensor_msgs/msg/image.hpp&gt; #include &lt;sensor_msgs/msg/camera_info.hpp&gt; #include &lt;tf2_geometry_msgs/tf2_geometry_msgs.hpp&gt; // 装甲板实际尺寸(单位:米) const double ARMOR_WIDTH = 0.13; const double ARMOR_HEIGHT = 0.055; const double HALF_WIDTH = ARMOR_WIDTH / 2.0; const double HALF_HEIGHT = ARMOR_HEIGHT / 2.0; class ArmorDetector : public rclcpp::Node { public: ArmorDetector() : Node(&quot;armor_detector&quot;) { // 订阅图像话题(需根据实际话题名修改) image_sub_ = image_transport::create_subscription( this, &quot;/camera/image_raw&quot;, std::bind(&amp;ArmorDetector::imageCallback, this, std::placeholders::_1), &quot;raw&quot;, rmw_qos_profile_sensor_data); // 发布处理后的图像 image_pub_ = image_transport::create_publisher(this, &quot;armor_detection_result&quot;); // TF广播器 tf_broadcaster_ = std::make_unique&lt;tf2_ros::TransformBroadcaster&gt;(*this); // 初始化相机内参(需根据实际相机标定修改) cv::camera_matrix_ = (cv::Mat_&lt;double&gt;(3, 3) &lt;&lt; 1749.23969217601 0 711.302879207889 0 1748.77539275011 562.465887239595 0 0 1); cv::Mat dis=(cv::Mat_&lt;double&gt;(1,5)&lt;&lt;0.0 0.0 0.0 0.0 0.0); // 定义装甲板3D角点(中心为原点) object_points_ = { {-HALF_WIDTH, -HALF_HEIGHT, 0.0}, // 左下 {HALF_WIDTH, -HALF_HEIGHT, 0.0}, // 右下 {HALF_WIDTH, HALF_HEIGHT, 0.0}, // 右上 {-HALF_WIDTH, HALF_HEIGHT, 0.0} // 左上 }; } private: void imageCallback(const sensor_msgs::msg::Image::ConstSharedPtr&amp; msg) { // 转换为OpenCV图像 void drawMyContours(std::string winName, cv::Mat &amp;image, std::vector&lt;std::vector&lt;cv::Point&gt;&gt; contours); cv::Point2d re_projection( const Eigen::Vector3d&amp; world_point, const Eigen::Matrix3d&amp; camera_matrix ); cv::Point2d re_projection( const Eigen::Vector3d&amp; world_point, const Eigen::Matrix3d&amp; camera_matrix ); cv::Mat image1 = cv_bridge::toCvShare(msg, &quot;bgr8&quot;)-&gt;image; cv::Mat binary,Gaussian,gray,kernal; kernal = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); cv::cvtColor(image1,gray,COLOR_BGR2GRAY); cv::threshold(gray,binary,120,255,0); cv::imshow(&quot;original3&quot;, binary); // cv::dilate(binary,binary,kernal); cv::erode(binary, binary, kernal); cv::imshow(&quot;dilated&quot;, binary); cv::waitKey(0); std::vector&lt;std::vector&lt;cv::Point&gt;&gt; contours; // 存储所有轮廓(二维点集) std::vector&lt;cv::Vec4i&gt; hierarchy; // cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // cv::Mat result = image1.clone(); cv::Mat result2 = image1.clone(); std::vector&lt;RotatedRect&gt; lightBarRects; for (size_t i = 0; i &lt; contours.size(); i++) { // 计算最小外接矩形 cv::RotatedRect minRect = cv::minAreaRect(contours[i]); lightBarRects.push_back(minRect); // 获取矩形的四个顶点 cv::Point2f vertices[4]; minRect.points(vertices); // 绘制最小外接矩形 for (int j = 0; j &lt; 4; j++) { cv::line(result, vertices[j], vertices[(j+1)%4], cv::Scalar(0, 255, 0), 2); } cv::imshow(&quot;Armor Detection&quot;, result); cv::waitKey(0); std::vector&lt;RotatedRect&gt; armorRects; const double maxAngleDiff = 15.0; cv::Point2f vertices2[4]; for (size_t i = 0; i &lt; lightBarRects.size(); i++) { for (size_t j = i + 1; j &lt; lightBarRects.size(); j++) { RotatedRect bar1 = lightBarRects[i]; RotatedRect bar2 = lightBarRects[j]; // 简化角度计算:直接取旋转矩形的角度(OpenCV原生角度) float angle1 = fabs(bar1.angle); float angle2 = fabs(bar2.angle); // 计算角度差(简化角度转换,直接用原生角度差) double angleDiff = fabs(angle1 - angle2); // 仅通过角度差判断是否匹配 if (angleDiff &lt; maxAngleDiff) { // 简化装甲板计算:直接用两灯条中心和尺寸构建 Point2f armorCenter = (bar1.center + bar2.center) / 2; float distance = norm(bar1.center - bar2.center); // 两灯条间距 Size2f armorSize(distance * 1.1, (bar1.size.height + bar2.size.height) / 2 * 1.2); float armorAngle = (bar1.angle + bar2.angle) / 2; // 平均角度 armorRects.push_back(RotatedRect(armorCenter, armorSize, armorAngle)); } } } for (auto&amp; armor : armorRects) { armor.points(vertices2); for (int j = 0; j &lt; 4; j++) { cv::line(result2, vertices2[j], vertices2[(j+1)%4], Scalar(0, 0, 255), 2); } imshow(&quot;hihi&quot;,result2); waitKey(0); } std::vector&lt;cv::Point2f&gt; vertices2_vec(vertices2, vertices2 + 4); std::vector&lt;cv::Point3f&gt;obj=std::vector&lt;cv::Point3f&gt;{ {-0.027555,0.675,0}, {-0.027555,-0.675,0}, {0.027555,-0.675,0}, {0.027555,0.675,0} }; cv::Mat rVec=cv::Mat::zeros(3,1,CV_64FC1); cv::Mat tVec=cv::Mat::zeros(3,1,CV_64FC1); cv::solvePnP(object_points_, image_points, camera_matrix_, dis,rvec, tvec, false, cv::SOLVEPNP_EPNP); cv::Mat R_cv; // OpenCV格式的旋转矩阵 cv::Rodrigues(rVec, R_cv); // 转换为Eigen矩阵 Eigen::Matrix3d R; for (int i = 0; i &lt; 3; i++) for (int j = 0; j &lt; 3; j++) R(i, j) = R_cv.at&lt;double&gt;(i, j); // 8. 将OpenCV的平移向量转换为Eigen向量 Eigen::Vector3d t; t &lt;&lt; tVec.at&lt;double&gt;(0), tVec.at&lt;double&gt;(1), tVec.at&lt;double&gt;(2); // 9. 定义世界原点(装甲板中心) Eigen::Vector3d yuandian(0, 0, 0); // 世界坐标系下的点 // 10. 坐标变换:世界坐标 &rarr; 相机坐标 Eigen::Vector3d cameraPoint = R * yuandian + t; cout &lt;&lt; &quot;装甲板中心在相机坐标系下的坐标:&quot; &lt;&lt; endl; cout &lt;&lt; &quot;X: &quot; &lt;&lt; cameraPoint(0) &lt;&lt; &quot; mm&quot; &lt;&lt; endl; cout &lt;&lt; &quot;Y: &quot; &lt;&lt; cameraPoint(1) &lt;&lt; &quot; mm&quot; &lt;&lt; endl; cout &lt;&lt; &quot;Z: &quot; &lt;&lt; cameraPoint(2) &lt;&lt; &quot; mm&quot; &lt;&lt; endl; // 11. 计算相机坐标系原点到世界坐标系原点的距离 double distance = t.norm(); // 等价于 sqrt(tx*tx + ty*ty + tz*tz) std::cout &lt;&lt; &quot;\n相机坐标系原点到世界坐标系原点的距离:&quot; &lt;&lt; std::endl; std::cout &lt;&lt; &quot;distance = &quot; &lt;&lt; distance &lt;&lt; &quot; mm&quot; &lt;&lt; std::endl; // 12. 使用re_projection函数进行重投影 Eigen::Matrix3d M; for (int i = 0; i &lt; 3; ++i) for (int j = 0; j &lt; 3; ++j) M(i, j) = camera.at&lt;double&gt;(i, j); cv::Point2d centerPixel = re_projection(cameraPoint, M); std::cout &lt;&lt; &quot;\n重投影到图像上的像素坐标:&quot; &lt;&lt; std::endl; std::cout &lt;&lt; &quot;u: &quot; &lt;&lt; centerPixel.x &lt;&lt; &quot; 像素&quot; &lt;&lt; std::endl; std::cout &lt;&lt; &quot;v: &quot; &lt;&lt; centerPixel.y &lt;&lt; &quot; 像素&quot; &lt;&lt; std::endl; // 13. 可视化结果 Mat result3 = image.clone(); circle(result3, centerPixel, 8, Scalar(0, 255, 255), -1); // 绘制黄色中心点 putText(result3, cv::format(&quot;(%.1f, %.1f)&quot;, centerPixel.x, centerPixel.y), centerPixel + Point2d(10, -10), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 255), 2); imshow(&quot;装甲板中心重投影&quot;, result3); waitKey(0); // 发布TF变换 publishTransform(rvec, tvec); } // 发布处理后的图像 auto result_msg = cv_bridge::CvImage(msg-&gt;header, &quot;bgr8&quot;, image1).toImageMsg(); image_pub_.publish(result_msg); } catch (const cv_bridge::Exception&amp; e) { RCLCPP_ERROR(this-&gt;get_logger(), &quot;CV Bridge error: %s&quot;, e.what()); } } void publishTransform(const cv::Mat&amp; rvec, const cv::Mat&amp; tvec) { // 转换为tf2 Transform tf2::Transform transform; cv::Mat rotation_mat; cv::Rodrigues(rvec, rotation_mat); tf2::Matrix3x3 tf_rot( rotation_mat.at&lt;double&gt;(0,0), rotation_mat.at&lt;double&gt;(0,1), rotation_mat.at&lt;double&gt;(0,2), rotation_mat.at&lt;double&gt;(1,0), rotation_mat.at&lt;double&gt;(1,1), rotation_mat.at&lt;double&gt;(1,2), rotation_mat.at&lt;double&gt;(2,0), rotation_mat.at&lt;double&gt;(2,1), rotation_mat.at&lt;double&gt;(2,2)); transform.setBasis(tf_rot); transform.setOrigin(tf2::Vector3( tvec.at&lt;double&gt;(0), tvec.at&lt;double&gt;(1), tvec.at&lt;double&gt;(2))); // 创建TransformStamped消息 geometry_msgs::msg::TransformStamped tf_msg; tf_msg.header.stamp = this-&gt;now(); tf_msg.header.frame_id = &quot;camera_frame&quot;; tf_msg.child_frame_id = &quot;armor_center&quot;; tf_msg.transform = tf2::toMsg(transform); tf_broadcaster_-&gt;sendTransform(tf_msg); } }; int main(int argc,char** argv) { rclcpp::init(argc,argv); auto node = std::make_shared&lt;AromorDector&gt;(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }
最新发布
08-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值