使用vsc实现求1+2!+3!+...+20!的和,并给出代码
时间: 2023-08-17 07:05:26 浏览: 183
可以使用循环结构来实现求和,具体代码如下:
```python
sum = 0 # 记录和
factorial = 1 # 记录阶乘
for i in range(1, 21):
factorial *= i # 计算阶乘
sum += factorial # 累加阶乘
print("1+2!+3!+...+20!的和为%d" % sum)
```
运行结果为:
```
1+2!+3!+...+20!的和为2561327494111820313
```
代码解析:
- 在循环开始前,我们先定义了两个变量`sum`和`factorial`,分别用来记录求和的结果和计算阶乘的中间结果;
- 在`for`循环中,我们从1到20枚举每个数字,每次循环计算当前数字对应的阶乘,并将其累加到`sum`中;
- 最后输出结果即可。
需要注意的是,由于20的阶乘已经非常大,所以在计算阶乘时需要使用`long`类型,否则可能会出现计算结果溢出的情况。
相关问题
计算机图形学图形二维变换vsC++实现代码
以下是C++实现的图形二维变换代码,包括平移、旋转、缩放和对称。这里使用了OpenCV库。
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
/**
* 平移变换
* @param src 原图像
* @param dst 结果图像
* @param x 水平方向平移量
* @param y 垂直方向平移量
*/
void translate(Mat& src, Mat& dst, int x, int y) {
Mat trans_mat = (Mat_<double>(2, 3) << 1, 0, x, 0, 1, y);
warpAffine(src, dst, trans_mat, src.size());
}
/**
* 旋转变换
* @param src 原图像
* @param dst 结果图像
* @param angle 旋转角度
* @param center 旋转中心
*/
void rotate(Mat& src, Mat& dst, double angle, Point center) {
Mat rot_mat = getRotationMatrix2D(center, angle, 1.0);
warpAffine(src, dst, rot_mat, src.size());
}
/**
* 缩放变换
* @param src 原图像
* @param dst 结果图像
* @param sx 水平方向缩放比例
* @param sy 垂直方向缩放比例
*/
void scale(Mat& src, Mat& dst, double sx, double sy) {
Mat scale_mat = (Mat_<double>(2, 3) << sx, 0, 0, 0, sy, 0);
warpAffine(src, dst, scale_mat, src.size());
}
/**
* 对称变换
* @param src 原图像
* @param dst 结果图像
* @param axis 对称轴(0表示水平轴,1表示垂直轴)
*/
void flip(Mat& src, Mat& dst, int axis) {
cv::flip(src, dst, axis);
}
int main() {
Mat src = imread("lena.jpg"); // 读取图像
if (src.empty()) {
std::cout << "Failed to load image!" << std::endl;
return -1;
}
Mat dst;
// 平移变换
translate(src, dst, 50, 50);
imshow("Translation", dst);
// 旋转变换
rotate(src, dst, 45, Point(src.cols / 2, src.rows / 2));
imshow("Rotation", dst);
// 缩放变换
scale(src, dst, 0.5, 0.5);
imshow("Scaling", dst);
// 对称变换
flip(src, dst, 0); // 水平对称
imshow("Flip_Horizontal", dst);
flip(src, dst, 1); // 垂直对称
imshow("Flip_Vertical", dst);
waitKey(0);
return 0;
}
```
注意:这里只是演示了基本的二维变换,实际应用中还需要考虑更多因素,比如边界处理、插值方法等。
vsc++姿态估计和人脸检测代码
以下是一个基于OpenCV和Dlib库的C++代码示例,用于姿态估计和人脸检测:
```c++
#include "opencv2/opencv.hpp"
#include "dlib/opencv.h"
#include "dlib/image_processing.h"
#include "dlib/image_processing/frontal_face_detector.h"
#include "dlib/image_processing/shape_predictor.h"
#include <iostream>
#include <fstream>
using namespace cv;
using namespace dlib;
using namespace std;
int main()
{
try
{
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor predictor;
deserialize("shape_predictor_68_face_landmarks.dat") >> predictor;
VideoCapture cap(0);
if (!cap.isOpened())
{
cerr << "Unable to connect to camera" << endl;
return 1;
}
namedWindow("Face Detection and Tracking", WINDOW_NORMAL);
setWindowProperty("Face Detection and Tracking", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN);
while (true)
{
Mat frame;
cap >> frame;
if (frame.empty())
{
cerr << "Unable to capture frame" << endl;
break;
}
cv_image<bgr_pixel> cimg(frame);
std::vector<rectangle> faces = detector(cimg);
std::vector<full_object_detection> shapes;
for (unsigned long i = 0; i < faces.size(); ++i)
{
full_object_detection shape = predictor(cimg, faces[i]);
shapes.push_back(shape);
}
for (unsigned long i = 0; i < faces.size(); ++i)
{
rectangle r = faces[i];
rectangle r_scaled(r.left() / 2, r.top() / 2, r.right() / 2, r.bottom() / 2);
rectangle frame_rect(0, 0, frame.cols, frame.rows);
if (frame_rect.contains(r_scaled.tl()) && frame_rect.contains(r_scaled.br()))
{
draw_rectangle(frame, r, cv::Scalar(0, 255, 0), 2);
full_object_detection shape = shapes[i];
for (unsigned long j = 0; j < shape.num_parts(); ++j)
{
circle(frame, cv::Point(shape.part(j).x(), shape.part(j).y()), 2, cv::Scalar(0, 0, 255), -1);
}
// 人脸姿态估计
std::vector<cv::Point3d> model_points;
// 3D模型点
model_points.push_back(cv::Point3d(0.0f, 0.0f, 0.0f)); // 鼻尖
model_points.push_back(cv::Point3d(0.0f, -330.0f, -65.0f)); // 下巴
model_points.push_back(cv::Point3d(-225.0f, 170.0f, -135.0f)); // 左眼内角
model_points.push_back(cv::Point3d(225.0f, 170.0f, -135.0f)); // 右眼内角
model_points.push_back(cv::Point3d(-150.0f, -150.0f, -125.0f)); // 左嘴角
model_points.push_back(cv::Point3d(150.0f, -150.0f, -125.0f)); // 右嘴角
std::vector<cv::Point2d> image_points;
// 2D图像点
for (unsigned long j = 0; j < shape.num_parts(); ++j)
{
image_points.push_back(cv::Point2d(shape.part(j).x(), shape.part(j).y()));
}
cv::Mat camera_matrix = (cv::Mat_<double>(3, 3) <<
1.0, 0, frame.cols / 2,
0, 1.0, frame.rows / 2,
0, 0, 1.0); // 内参矩阵
cv::Mat dist_coeffs = cv::Mat::zeros(4, 1, cv::DataType<double>::type); // 4个畸变系数:k1,k2,p1,p2
cv::Mat rotation_vector; // 旋转向量
cv::Mat translation_vector; // 平移向量
cv::solvePnP(model_points, image_points, camera_matrix, dist_coeffs, rotation_vector, translation_vector);
// 旋转向量转换为旋转矩阵
cv::Mat rotation_matrix;
cv::Rodrigues(rotation_vector, rotation_matrix);
// 投影矩阵
cv::Matx34d projection_matrix(
rotation_matrix.at<double>(0, 0), rotation_matrix.at<double>(0, 1), rotation_matrix.at<double>(0, 2), translation_vector.at<double>(0),
rotation_matrix.at<double>(1, 0), rotation_matrix.at<double>(1, 1), rotation_matrix.at<double>(1, 2), translation_vector.at<double>(1),
rotation_matrix.at<double>(2, 0), rotation_matrix.at<double>(2, 1), rotation_matrix.at<double>(2, 2), translation_vector.at<double>(2)
);
// 计算欧拉角
cv::Vec3d euler_angles;
cv::Matx33d rotation_matrix_ = rotation_matrix;
double sy = sqrt(rotation_matrix_(0, 0) * rotation_matrix_(0, 0) + rotation_matrix_(1, 0) * rotation_matrix_(1, 0));
bool singular = sy < 1e-6;
if (!singular)
{
euler_angles[0] = atan2(rotation_matrix_(2, 1), rotation_matrix_(2, 2));
euler_angles[1] = atan2(-rotation_matrix_(2, 0), sy);
euler_angles[2] = atan2(rotation_matrix_(1, 0), rotation_matrix_(0, 0));
}
else
{
euler_angles[0] = atan2(-rotation_matrix_(1, 2), rotation_matrix_(1, 1));
euler_angles[1] = atan2(-rotation_matrix_(2, 0), sy);
euler_angles[2] = 0;
}
// 显示欧拉角信息
stringstream ss;
ss << "Yaw: " << euler_angles[1] * 180 / CV_PI << " degrees" << endl;
ss << "Pitch: " << euler_angles[0] * 180 / CV_PI << " degrees" << endl;
ss << "Roll: " << euler_angles[2] * 180 / CV_PI << " degrees" << endl;
cv::putText(frame, ss.str(), cv::Point(10, frame.rows - 50), cv::FONT_HERSHEY_SIMPLEX, 0.7, cv::Scalar(0, 0, 255), 2);
}
}
imshow("Face Detection and Tracking", frame);
if (waitKey(1) == 27)
{
break;
}
}
destroyAllWindows();
}
catch (exception& e)
{
cerr << e.what() << endl;
}
return 0;
}
```
这段代码实现了从摄像头捕捉视频流,实时检测人脸并标出关键点,同时根据人脸关键点进行姿态估计,并在视频中显示欧拉角信息。请注意,由于姿态估计需要3D模型点,因此需要预先定义这些点的坐标。在这个示例中,我们将这些点硬编码为固定值。这段代码还需要使用OpenCV和Dlib库,因此请确保在编译代码之前安装这些库。
阅读全文