利用线结构光和单目进行三维重构(测距)
参考声明:
本文是转载内容,原文链接:https://www.cnblogs.com/hoo334/p/9371091.html,若有侵权,请联系删除!
目录
- 参考声明:
- 介绍
- 基础准备
- 四个坐标系的转换
- 系统测量模型
- 系统实现方案
- 相机标定和光平面实现
- 光平面标定
- 运用光平面方程求距离
- 参考代码
介绍
通过线激光器扫描物体,同时用摄像机对其拍照得到带有结构光的图片,提取结构光上的点的三维坐标,激光器扫描整个物体就可求出所有点的三维坐标实现物体表面的三维重构,即可测量物体表面任意两点距离。
基础准备
四个坐标系的转换
世界坐标系–摄像机坐标系
将摄像机光心定位摄像机坐标原点Oc,摄像机的光轴定位摄像机坐标系的Zc轴,Xc轴,Yc轴分别与图像坐标系的x轴y轴平行。
R为3阶正交单位矩阵,t为平移向量,均为相机外参数
物理坐标系–像素坐标系
图像的x,y轴分别和像素的u,v轴平行
u=x/dx+u0, v=y/dy+v0
物理坐标系–摄像机坐标系
像素坐标系–世界坐标系
fx,fy,u0,v0为摄像机内部参数,R,t,为外部参数
系统测量模型
P点既在OP’直线上又在光平面上(由结构光投射器与物体表面结构光构成的平面),摄像机和结构光投射器相对位置不变,光平面方程不变,设摄像机下光平面方程为
设点P’在摄像机坐标系下的图像坐标(x,y,1)P点坐标为(Xc,Yc,Zc)则直线OcP直线方程为
联立可得
求空间点在摄像机坐标系下的空间三维坐标需要光平面方程,P’点的图像坐标,求解P’的坐标需要摄像机内参数,所以需要摄像机标定和光平面标定。
系统实现方案
固定摄像机和激光器,移动器棋盘格拍摄带有结构光和不带结构光的图片,需要不同角度拍摄。
通过harris角点提取图片中角点像素坐标
运用张正友标定思想完成相机标定
提取线结构光方程,与图像角点直线方程结合,求角点直线和结构光的交点坐标
通过角点的像素坐标和角点与结构光的交点坐标运用交比不变性得到结构光上一系列交点的摄像机坐标,通过最小二乘拟合得到摄像机坐标系下的光平面方程
运用光平面方程,可得到结构光上任意一点的相机坐标
相机标定和光平面实现
Qt+openCV
cameraCalibrate函数原型
calibrateCamera(InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints,
Size imageSize,
InputOutputArray cameraMatrix,
InputOutputArray distCoeffs,
OutputArrayOfArrays rvecs,
OutputArrayOfArrays tvecs,
int flags=0 );
参数 :
objectPoints 初始化世界坐标系的所有角点的三维坐标点
应输入 vector<vector> objectPoints
imagePoints 与其对应的像素坐标系的所有角点的二维坐标点
应输入 vector< vector< Point2f>> imagePoints
imageSize 图像大小
cameraMatrix 相机内参数矩阵
输入一个cv::Mat cameraMatrix即可。
distCoeffs 为畸变矩阵。输入一个cv::Mat distCoeffs即可
rvecs 为旋转向量 应输入一个vectorcv::Mat
tvecs 为平移向量 应输入一个vectorcv::Mat
flags为标定是所采用的算法。可如下某个或者某几个参数:
CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,cx,cy的估计值。否则的话,将初始化(cx,cy)图像的中心点,使用最小二乘估算出fx,fy。如果内参数矩阵和畸变居中已知的时候,应该标定模块中的solvePnP()函数计算外参数矩阵。
CV_CALIB_FIX_PRINCIPAL_POINT:在进行优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中心或者某个输入的值。
CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只将fy作为可变量,进行优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx和fy将会被忽略。只有fx/fy的比值在计算中会被用到。
CV_CALIB_ZERO_TANGENT_DIST:设定切向畸变参数(p1,p2)为零。
CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6:对应的径向畸变在优化中保持不变。如果设置了CV_CALIB_USE_INTRINSIC_GUESS参数,
CV_CALIB_RATIONAL_MODEL:计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。
摄像机标定需要角点的世界坐标棋盘格表面为x-y轴,所以棋盘格角点z坐标全为0,已知两角点的实际距离就可求出所有角点的世界坐标
摄像机标定还需角点的像素坐标
利用openCV库函数findChessboardCorners()可以提取到。
带入这两个参数到cameraCalibrate函数即可求出相机内参数和每幅图对应的外参数
光平面标定
1、提取线结构光中心线方程,结构光处像素值为255利用二值化原理提取只含结构光的图像,利用goodFeaturesToTrack()取得结构光上的点,将这些点代入fitline(),拟合得到线结构光方程。
2、拟合角点直线方程,结合线结构光中心线方程,求两直线交点可得一系列光条上的点的像素坐标。
3、通过角点世界坐标,结合相机所求每一幅图的相机外参数,求出每幅图的角点摄像机坐标
4、通过摄像机内参数,将角点图像坐标转换为角点物理坐标
5、已知A B C 角点 D 为角点直线与结构光角点直线的交点,A’ B ‘ C’ D’为成像点,已知A’ B ‘ C’ D’四点物理坐标或像素坐标,A B C三点相机坐标可求出D的相机坐标。
6、对于多幅图求出物体表面结构光与角点直线的交点坐标运用最小二乘拟合得到光平面方程
运用光平面方程求距离
鼠标点击结构光上任意两点获取两点的像素坐标通过公式
其中1/dx=fx,1/dy=fy,fx,fy均为摄像机内参数然后物理坐标转为摄像机坐标
运用两点间距离公式可求出结构光上两点实际距离。
参考代码
最小二乘拟合平面
CvMat*points_mat = cvCreateMat(X_vector.size(), 3, CV_32FC1);//定义用来存储需要拟合点的矩阵大小N*3; for (int i=0;i < X_vector.size(); ++i){points_mat->data.fl[i*3+0] = X_vector[i];//矩阵的值进行初始化 X的坐标值points_mat->data.fl[i * 3 + 1] = Y_vector[i];// Y的坐标值points_mat->data.fl[i * 3 + 2] = Z_vector[i];//<span style="font-family: Arial, Helvetica, sans-serif;">// Z的坐标值</span>}float plane12[4] = { 0 };//定义用来储存平面参数的数组 cvFitPlane(points_mat, plane12);//调用方程 // 其中 Plane12[4] 数组中对应ABCD;//Ax+by+cz=Dvoid cvFitPlane(const CvMat* points, float* plane){// Estimate geometric centroid.int nrows = points->rows;int ncols = points->cols;int type = points->type;CvMat* centroid = cvCreateMat(1, ncols, type);cvSet(centroid, cvScalar(0));for (int c = 0; c<ncols; c++){for (int r = 0; r < nrows; r++){centroid->data.fl[c] += points->data.fl[ncols*r + c];}centroid->data.fl[c] /= nrows;}// Subtract geometric centroid from each point.CvMat* points2 = cvCreateMat(nrows, ncols, type);for (int r = 0; r<nrows; r++)for (int c = 0; c<ncols; c++)points2->data.fl[ncols*r + c] = points->data.fl[ncols*r + c] - centroid->data.fl[c];// Evaluate SVD of covariance matrix.CvMat* A = cvCreateMat(ncols, ncols, type);CvMat* W = cvCreateMat(ncols, ncols, type);CvMat* V = cvCreateMat(ncols, ncols, type);cvGEMM(points2, points, 1, NULL, 0, A, CV_GEMM_A_T);cvSVD(A, W, NULL, V, CV_SVD_V_T);// Assign plane coefficients by singular vector corresponding to smallest singular value.plane[ncols] = 0;for (int c = 0; c<ncols; c++){plane[c] = V->data.fl[ncols*(ncols - 1) + c];plane[ncols] += plane[c] * centroid->data.fl[c];}// Release allocated resources.//cvReleaseMat(¢roid);cvReleaseMat(&points2);cvReleaseMat(&A);cvReleaseMat(&W);cvReleaseMat(&V);}
最小二乘拟合线:
函数原型如下
void fitLine( InputArray points,OutputArray line,int distType,double param,double reps,
double aeps );
distType 指定拟合函数的类型,可以取 CV_DIST_L2
param 就是 CV_DIST_FAIR、CV_DIST_WELSCH、CV_DIST_HUBER 公式中的C。如果取 0,则程序自动选取合适的值。
reps 表示直线到原点距离的精度,建议取 0.01。
aeps 表示直线角度的精度,建议取 0.01。
计算出的直线信息存放在 line 中,为 cv::Vec4f 类型。line[0]、line[1] 存放的是直线的方向向量。line[2]、line[3] 存放的是直线上一个点的坐标。
如果直线用 y=kx+by=kx+b 来表示,那么 k = line[1]/line[0],b = line[3] - k * line[2]
附部分源码
其中部分为ui设计和对特定图片写的去结构光的算法不可生搬硬套!
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <iostream>
#include <fstream>
#include<QFileDialog>
#include<QString>
#include<QImage>
#include<QPixmap>
#include <QWidget>
#include<QMouseEvent>
#include<QEvent>
#include<QDebug>
#include<QMessageBox>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2\imgproc\types_c.h>using namespace cv;
using namespace std;
#define IMGCOUNT 14
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECT
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void cameraCalibrate();//无结构光摄像机标定void squareCalibrate();//有结构光摄像机标定和光平面标定Point2f getcrosspoint(Vec4f lineA,Vec4f lineB);//找出两条直线的交点void GetCrossPointAll();//找出所有图片的结构光交点void calMatrix_M();//计算世界坐标系与摄像机坐标系的关系矩阵Mvoid calCameraCornerPoints();//计算摄像机坐标系下的角点坐标void calCameraCrossPoints();//计算摄像机坐标下的结构光交点坐标void calCornersInCamera(Point2f A,Point2f B,Point2f C,Point2f D,Mat A_,Mat B_,Mat C_);void fitting_light_surface();void cvFitPlane(const CvMat* points, float* plane);void calDistance();void pushbutton1();
public slots:void open();
protected:void mousePressEvent(QMouseEvent *m);//重载mousePressEvent函数
private:double zoom=1;vector<Point2f> mousePoint;QString path;
private:Ui::MainWindow *ui;int imageCount;string file;Size image_size;//图像的尺寸Size board_size; //标定板上每列,行的角点数7 size.width 代表列数 size.height 代表 行数vector<Point2f> image_points_buf; //缓存每幅图像上检测到的角点vector<vector<Point3f>> object_points; //保存标定板上角点的三维坐标,为标定函数的第一个参数vector<vector<Point2f>> image_points_seq; //保存检测到的所有角点Size square_size;//实际测量得到的标定板上每个棋盘格的大小,这里其实没测,就假定了一个值,Mat cameraMatrix;//摄像机内参数Mat distCoeffs;//畸变系数vector<Mat> tvecsMat;//每幅图像的旋转向量vector<Mat> R_matrix;//每幅图的旋转矩阵vector<Mat> rvecsMat;//每幅图像的平移向量vector<Point2f>corners;//结构光上的点Vec4f line_para; //输出的直线vector<Mat> M;//摄像机坐标 世界坐标 转换系数vector<vector<Mat>>corners_in_camera;//角点在相机坐标系下的坐标vector<vector<Point2f>>crossPointAll;//所有图像的结构光与角点直线的坐标//拟合点的三维坐标vector<double>X_vector;vector<double>Y_vector;vector<double>Z_vector;float plane12[4] = { 0 };//定义用来储存平面参数的数组
};#endif // MAINWINDOW_H#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);connect(ui->actioncalibrateCamera,SIGNAL(triggered()),this,SLOT(cameraCalibrate()));connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(pushbutton1()));connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(open()));ui->rows->setValue(7);ui->cols->setValue(7);ui->filename->setText("D:\\QT projects\\PIC\\struct_image_copy");ui->dis->setValue(10);ui->pic->setValue(11);}MainWindow::~MainWindow(){delete ui;}void MainWindow::cameraCalibrate(){board_size.width=ui->cols->value();board_size.height=ui->rows->value();QString f="D:\\QT projects\\PIC\\cal_image_copy";for (int image_num = 1; image_num <= IMGCOUNT; image_num++){QString n("\\%1.bmp");n=n.arg(image_num);QString m=f+n;string file=string((const char *)m.toLocal8Bit());Mat imageInput = imread(file);if (!findChessboardCorners(imageInput, board_size, image_points_buf)){cout << "can not find chessboard corners!\n";//找不到角点return;}else{Mat view_gray;//灰度图cvtColor(imageInput, view_gray, CV_RGB2GRAY);/*亚像素精确化*/find4QuadCornerSubpix(view_gray, image_points_buf, Size(5, 5));//对粗提取的角点进行精确化drawChessboardCorners(view_gray, board_size, image_points_buf, true);//用于在图片中标记角点image_points_seq.push_back(image_points_buf);//保存亚像素角点imshow("Camera Calibration", view_gray);//显示图片waitKey(500);//停半秒}image_size.width = imageInput.cols;image_size.height = imageInput.rows;imageInput.release();}/*相机标定*/for (int t = 0; t<IMGCOUNT; t++){vector<Point3f> tempPointSet; //世界坐标点for (int i = 0; i<board_size.width; i++)//每列 size.width代表图像的宽度 即列数{for (int j = 0; j<board_size.height; j++)//每行{Point3f realPoint;//假设标定板放在世界坐标系中z=0的平面上realPoint.x = j*square_size.width;realPoint.y = i*square_size.height;realPoint.z = 0;tempPointSet.push_back(realPoint);}}object_points.push_back(tempPointSet);}//内外参数对象cameraMatrix = Mat(3, 3,CV_32FC1, Scalar::all(0));//摄像机内参数矩阵// vector<int> point_counts;// 每幅图像中角点的数量distCoeffs = Mat(1, 5, CV_64F, Scalar::all(0));//摄像机的5个畸变系数:k1,k2,p1,p2,k3calibrateCamera(object_points, image_points_seq, image_size, cameraMatrix, distCoeffs, rvecsMat, tvecsMat, 0);//相机标定/*保存内外参数*/ofstream fout("caliberation_result.txt");//保存标定结果的文件fout << "相机内参数矩阵:" << endl;fout << cameraMatrix << endl << endl;fout << "畸变系数:\n";fout << distCoeffs << endl << endl << endl;waitKey(0);//停半秒}void MainWindow::squareCalibrate(){object_points.clear();image_points_seq.clear();for (int image_num = 1; image_num <= imageCount; image_num++){QString n("\\%1.bmp");n=n.arg(image_num);QString m=path+n;file=string((const char *)m.toLocal8Bit());//sprintf(filenames, "D:\\QT projects\\PIC\\struct_image_copy\\%d.bmp", image_num);Mat origin_image = imread(file);Mat grey_image;cvtColor(origin_image, grey_image, CV_RGB2GRAY);CV_Assert(grey_image.depth() != sizeof(uchar));int row=grey_image.rows;int col=grey_image.cols;uchar*p;/*阶段去除高亮部分*/for(int i=0;i<row;i++){p=grey_image.ptr<uchar>(i);for(int j=0;j<col;j++){if(p[j]>250)p[j]-=100;if(p[j]>220)p[j]-=70;if(p[j]>190)p[j]-=30;if(p[j]>170)p[j]-=10;}}/*去除黑方格上的亮点*/for(int i=0;i<row;i++){p=grey_image.ptr<uchar>(i);for(int j=0;j<col;j++){if(p[j]>140){if(j<15&&p[j+15]<100)p[j]=p[j+15];if((j>15)&&(j<col-15)){if(p[j+15]<100)p[j]=p[j+15];if(p[j+15]<100)p[j]=p[j-15];}if(j>col-15&&p[j+15]<100)p[j]=p[j-15];}}}/*腐蚀进一步消除*/Mat ele = getStructuringElement(MORPH_RECT,Size(4,4));Mat ele2 = getStructuringElement(MORPH_RECT,Size(2,2));erode(grey_image,grey_image,ele);//erode函数直接进行腐蚀操作dilate(grey_image,grey_image,ele2);//膨胀增加精确度// imshow("after erode operation",grey_image);Mat imageInput=grey_image.clone();if (!findChessboardCorners(imageInput, board_size, image_points_buf,CV_CALIB_CB_FILTER_QUADS)){cout << "can not find chessboard corners!\n";//找不到角点return;}else{Mat view_gray=grey_image.clone();/*亚像素精确化*/find4QuadCornerSubpix(view_gray, image_points_buf, Size(5, 5));//对粗提取的角点进行精确化drawChessboardCorners(view_gray, board_size, image_points_buf, true);//用于在图片中标记角点image_points_seq.push_back(image_points_buf);//保存亚像素角点// imshow("Camera Calibration", view_gray);//显示图片waitKey(100);}image_size.width = imageInput.cols;image_size.height = imageInput.rows;imageInput.release();}/*相机标定*/for (int t = 0; t<imageCount; t++){vector<Point3f> tempPointSet;for (int i = 0; i<board_size.width; i++)//每列{for (int j = 0; j<board_size.height; j++)//每行{Point3f realPoint;//假设标定板放在世界坐标系中z=0的平面上realPoint.x = j*square_size.width;//小方格的宽度realPoint.y = i*square_size.height;realPoint.z = 0;tempPointSet.push_back(realPoint);}}object_points.push_back(tempPointSet);}//内外参数对象cameraMatrix = Mat(3, 3, CV_32FC1, Scalar::all(0));//摄像机内参数矩阵//int point_counts;// 每幅图像中角点的数量distCoeffs = Mat(1, 5, CV_32FC1, Scalar::all(0));//摄像机的5个畸变系数:k1,k2,p1,p2,k3calibrateCamera(object_points, image_points_seq, image_size, cameraMatrix, distCoeffs, rvecsMat, tvecsMat, 0);//相机标定/*二值化*/Mat origin_image=imread(file);//Mat grey_image;cvtColor(origin_image, grey_image, CV_RGB2GRAY);// imshow("origin",origin_image);// imshow("grey",grey_image);//waitKey(100);Mat binary_image;threshold(grey_image,binary_image,240, 255, CV_THRESH_BINARY);//imshow("binary",binary_image);//寻找二值化图像上的角点并保存goodFeaturesToTrack(binary_image,corners,18,0.01,10,Mat());for(unsigned int i=0;i<corners.size();i++){circle(origin_image,corners[i],2,Scalar(255,0,0),2);}// imshow("binary points",origin_image);/*直线拟合*/fitLine(corners, line_para, cv::DIST_L2, 0, 1e-2, 1e-2);cv::Point point0;point0.x = line_para[2];point0.y = line_para[3];double k = line_para[1] / line_para[0];//计算直线的端点(y = k(x - x0) + y0)Point point1, point2;point1.x = 0;point1.y = k * (0 - point0.x) + point0.y;point2.x = origin_image.cols;point2.y = k * (origin_image.cols - point0.x) + point0.y;cv::line(origin_image, point1, point2, cv::Scalar(255, 255, 0), 2, 8, 0);// cv::imshow("image", origin_image);/*获取结构光与角点直线坐标*/GetCrossPointAll();/*将旋转向量转换成旋转矩阵*/ for(int i=0;i<imageCount;i++){ Mat temp;Rodrigues(rvecsMat[i],temp );R_matrix.push_back(temp);}/*求M矩阵*/calMatrix_M();/*求角点的摄像机坐标*/calCameraCornerPoints();/*交比不变求结构光与角点直线的摄像机坐标*/calCameraCrossPoints();/*拟合光平面*/fitting_light_surface();/*保存内外参数*/ofstream fout("struct_caliberation_result.txt");//保存标定结果的文件fout << "相机内参数矩阵:" << endl;fout << cameraMatrix << endl << endl;fout << "畸变系数:\n";fout<<distCoeffs<<endl;fout<<"第一幅图角点像素坐标"<<endl<<image_points_seq[0]<<endl;fout<<"第一幅图角点世界坐标"<<endl<<object_points[0]<<endl;fout<<"第一幅图交点像素坐标"<<endl<<crossPointAll[0]<<endl;fout<<"a b c d"<<image_points_seq[10][0]<<endl<<image_points_seq[10][3]<<endl<<image_points_seq[10][6]<<endl<<crossPointAll[1][0]<<endl;fout<<"camera"<<endl<<corners_in_camera[6][0]<<endl<<corners_in_camera[6][3]<<endl<<corners_in_camera[6][6]<<endl;fout<<plane12[0]<<" "<<plane12[1]<<" "<<plane12[2]<<" "<<plane12[3]<<endl;for(int i=0;i<50;i++)fout<<"X_vector"<<" "<<X_vector[i]<<" "<<"Y_vector"<<" "<<Y_vector[i]<<" "<<"Z_vector"<<" "<<Z_vector[i]<<endl;waitKey(0);//停半秒}Point2f MainWindow:: getcrosspoint(Vec4f lineA,Vec4f lineB){ //求两条直线角点double ka=lineA[1]/lineA[0];double kb=lineB[1]/lineB[0];Point2f cross_point;cross_point.x=(lineB[3]-lineA[3]+ka*lineA[2]-kb*lineB[2])/(ka-kb);cross_point.y=ka*(cross_point.x-lineA[2])+lineA[3];return cross_point;}void MainWindow:: GetCrossPointAll(){for(int i=0;i<imageCount;i++)//11幅图{vector<Point2f>crossPointPerPic;for(int j=0;j<board_size.height;j++)//遍历每行{vector<Point2f>temp;//取每行角点for(int m=0;m<board_size.width;m++)temp.push_back(image_points_seq[i][j*7+m]);Vec4f para;fitLine(temp,para,DIST_L2,0,1e-2,1e-2);//拟合每行角点直线Point2f temp_point=getcrosspoint(para,line_para);//得出角点直线与结构光交点crossPointPerPic.push_back(temp_point);}crossPointAll.push_back(crossPointPerPic);}}void MainWindow::calMatrix_M(){//利用旋转矩阵和平移向量求得摄像机坐标系和世界坐标系之间的关系矩阵Mfor(int k=0;k<imageCount;k++){ Mat temp(4,4,CV_32F);for(int i=0;i<3;i++)for(int j=0;j<3;j++){temp.at<float>(i,j)=R_matrix[k].at<double>(i,j);temp.at<float>(0,3)=tvecsMat[k].at<double>(0);temp.at<float>(1,3)=tvecsMat[k].at<double>(1);temp.at<float>(2,3)=tvecsMat[k].at<double>(2);temp.at<float>(3,0)=0;temp.at<float>(3,1)=0;temp.at<float>(3,2)=0;temp.at<float>(3,3)=1;}M.push_back(temp);}}void MainWindow::calCameraCornerPoints(){//求出摄像机坐标系下的角点for(int i=0;i<imageCount;i++){vector<Mat>temp;for(int j=0;j<board_size.height;j++)for(int k=0;k<board_size.width;k++){ Mat temp2(4,1,CV_32F);Mat world(4,1,CV_32F);world.at<float>(0)=object_points[i][j*7+k].x;//取出世界坐标系下的角点world.at<float>(1)=object_points[i][j*7+k].y;world.at<float>(2)=object_points[i][j*7+k].z;world.at<float>(3)=1;temp2=M[i]*world;//转换为摄像机坐标系temp.push_back(temp2);}corners_in_camera.push_back(temp);}}void MainWindow::calCameraCrossPoints(){for(int i=0;i<imageCount;i++){for(int j=0;j<board_size.height;j++){ //每行取三个角点Point2f A=image_points_seq[i][j*7];//找到每行的第1,4,7个角点Point2f B=image_points_seq[i][j*7+3];Point2f C=image_points_seq[i][j*7+6];Point2f D=crossPointAll[i][j];//每行的结构光交点Mat A_=corners_in_camera[i][j*7];//找到对应角点在摄像机坐标下的坐标Mat B_=corners_in_camera[i][j*7+3];Mat C_=corners_in_camera[i][j*7+6];calCornersInCamera(A,B,C,D,A_,B_,C_);//将角点坐标转换为摄像机坐标}}}void MainWindow::calCornersInCamera(Point2f A,Point2f B,Point2f C,Point2f D,Mat A_,Mat B_,Mat C_){double CR=(D.x-B.x)*(A.x-C.x)/((A.x-B.x)*(D.x-C.x));//求出交比//利用像素坐标系下求得的交比,利用交比不变性求出结构光点在摄像机下的坐标,已知,A,B,C,D像素坐标和A_,B_,C_,摄像机坐标可求D_坐标//由于像素坐标系与物理坐标系是线性关系,可省略像素坐标系转图像坐标系这一步,在像素坐标系下求得的交比与在图像坐标系下求得的交比一样double m=CR*(A_.at<float>(0)-B_.at<float>(0))/(A_.at<float>(0)-C_.at<float>(0));double x=(B_.at<float>(0)-m*C_.at<float>(0))/(1-m);double y=(B_.at<float>(1)-m*C_.at<float>(1))/(1-m);double z=(B_.at<float>(2)-m*C_.at<float>(2))/(1-m);X_vector.push_back(x); Y_vector.push_back(y); Z_vector.push_back(z);}void MainWindow::fitting_light_surface(){CvMat*points_mat = cvCreateMat(X_vector.size(), 3, CV_32FC1);//定义用来存储需要拟合点的矩阵大小N*3;for (unsigned int i=0;i < X_vector.size(); ++i){points_mat->data.fl[i*3+0] = X_vector[i];//矩阵的值进行初始化 X的坐标值points_mat->data.fl[i * 3 + 1] = Y_vector[i];// Y的坐标值points_mat->data.fl[i * 3 + 2] = Z_vector[i];//<span style="font-family: Arial, Helvetica, sans-serif;">// Z的坐标值</span>}cvFitPlane(points_mat, plane12);//调用方程}void MainWindow::cvFitPlane(const CvMat* points, float* plane){int nrows = points->rows;int ncols = points->cols;int type = points->type;CvMat* centroid = cvCreateMat(1, ncols, type);cvSet(centroid, cvScalar(0));for (int c = 0; c<ncols; c++){for (int r = 0; r < nrows; r++){centroid->data.fl[c] += points->data.fl[ncols*r + c];}centroid->data.fl[c] /= nrows;}// Subtract geometric centroid from each point.CvMat* points2 = cvCreateMat(nrows, ncols, type);for (int r = 0; r<nrows; r++)for (int c = 0; c<ncols; c++)points2->data.fl[ncols*r + c] = points->data.fl[ncols*r + c] - centroid->data.fl[c];// Evaluate SVD of covariance matrix.CvMat* A = cvCreateMat(ncols, ncols, type);CvMat* W = cvCreateMat(ncols, ncols, type);CvMat* V = cvCreateMat(ncols, ncols, type);cvGEMM(points2, points, 1, NULL, 0, A, CV_GEMM_A_T);cvSVD(A, W, NULL, V, CV_SVD_V_T);// Assign plane coefficients by singular vector corresponding to smallest singular value.plane[ncols] = 0;for (int c = 0; c<ncols; c++){plane[c] = V->data.fl[ncols*(ncols - 1) + c];plane[ncols] += plane[c] * centroid->data.fl[c];}// Release allocated resources.//cvReleaseMat(¢roid);cvReleaseMat(&points2);cvReleaseMat(&A);cvReleaseMat(&W);cvReleaseMat(&V);}void MainWindow::mousePressEvent(QMouseEvent *e){static int i=0;if(i<2){if(i==0){ui->x1->setText(QString::number(0));ui->y1->setText(QString::number(0));ui->x2->setText(QString::number(0));ui->y2->setText(QString::number(0));ui->realdis->setText(QString::number(0));}Point2f temp;temp.x = e->x();temp.y = e->y()-34;//纵坐标应减去MainWindow上方空白的长度if(i==0){ui->x1->setText(QString::number(temp.x));ui->y1->setText(QString::number(temp.y));}if(i==1){ui->x2->setText(QString::number(temp.x));ui->y2->setText(QString::number(temp.y));}mousePoint.push_back(temp);++i;}else{ //收集到两个点之后再次点击鼠标计算距离并清空mousePointif(image_points_seq.size()!=0){ calDistance();i-=2;mousePoint.pop_back();mousePoint.pop_back();}elseQMessageBox::warning( this, tr("warning"),tr("未标定摄像机和光平面"""));}}void::MainWindow::open(){QString path = QFileDialog::getOpenFileName(this,"文件对话框","../",//上一级路径"Image(*.bmp *.jpg *.png)");QImage* image=new QImage(path);if(image->width()>1500)zoom=(double)image->width()/1500;//宽度大于1500像素进行缩放 zoom为缩放比int width = image->width()/zoom;//缩放后的宽度int height = image->height()/zoom;//缩放后的高度//QPixmap fitpixmap = pixmap.scaled(width, height,Qt::KeepAspectRatio Qt::IgnoreAspectRatio, Qt::SmoothTransformation); // 饱满填充QPixmap pixmap = QPixmap::fromImage(*image);QPixmap fitpixmap = pixmap.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); // 按比例缩放//重新设置label的面积使图片充满整个label区域ui->label->resize(width,height);ui->label->setPixmap(fitpixmap);}void MainWindow::calDistance(){//获取需要的数据//double fx=7079.108034043226; double fy=7138.477799905151;//double u0=1385.469717666468; double v0=1009.67646851548;//double a=0.999773;double b=-0.0105343;double c= 0.0185257;double d= -19.9609;double fx= cameraMatrix.at<double>(0,0);double fy= cameraMatrix.at<double>(1,1);double u0=cameraMatrix.at<double>(0,2);double v0=cameraMatrix.at<double>(1,2);double a=(double)plane12[0];double b=(double)plane12[1];double c=(double)plane12[2];double d=(double)plane12[3];Mat physic_to_pixel(3,3,CV_32F);//归一化坐标和像素坐标之间的关系矩阵physic_to_pixel.at<float>(0,0)=(double)fx;physic_to_pixel.at<float>(0,1)=0;physic_to_pixel.at<float>(0,2)=u0;physic_to_pixel.at<float>(1,0)=0;physic_to_pixel.at<float>(1,1)=(double)fy;physic_to_pixel.at<float>(1,2)=v0;physic_to_pixel.at<float>(2,0)=0;physic_to_pixel.at<float>(2,1)=0;physic_to_pixel.at<float>(2,2)=1;//两个点的像素,摄像机,归一化物理坐标Mat pixel1(3,1,CV_32F);Mat pixel2(3,1,CV_32F);Mat camera1(3,1,CV_32F);Mat camera2(3,1,CV_32F);Mat physic1(3,1,CV_32F);Mat physic2(3,1,CV_32F);//赋值 计算pixel1.at<float>(0)=mousePoint[0].x*zoom;pixel1.at<float>(1)=mousePoint[0].y*zoom;pixel1.at<float>(2)=1;pixel2.at<float>(0)=mousePoint[1].x*zoom;pixel2.at<float>(1)=mousePoint[1].y*zoom;pixel2.at<float>(2)=1;physic1=physic_to_pixel.inv()*pixel1;physic2=physic_to_pixel.inv()*pixel2;camera1.at<float>(0)=(d/(a*physic1.at<float>(0)+b*physic1.at<float>(1)+c))*physic1.at<float>(0); camera1.at<float>(1)=(d/(a*physic1.at<float>(0)+b*physic1.at<float>(1)+c))*physic1.at<float>(1); camera1.at<float>(2)=(d/(a*physic1.at<float>(0)+b*physic1.at<float>(1)+c))*physic1.at<float>(2);camera2.at<float>(0)=(d/(a*physic2.at<float>(0)+b*physic2.at<float>(1)+c))*physic2.at<float>(0);camera2.at<float>(1)=(d/(a*physic2.at<float>(0)+b*physic2.at<float>(1)+c))*physic2.at<float>(1);camera2.at<float>(2)=(d/(a*physic2.at<float>(0)+b*physic2.at<float>(1)+c))*physic2.at<float>(2);//得到两点在摄像机坐标下得距离double dis=sqrt((camera1.at<float>(0)-camera2.at<float>(0))*(camera1.at<float>(0)-camera2.at<float>(0))+(camera1.at<float>(1)-camera2.at<float>(1))*(camera1.at<float>(1)-camera2.at<float>(1))+(camera1.at<float>(2)-camera2.at<float>(2))*(camera1.at<float>(2)-camera2.at<float>(2)));ui->realdis->setText(QString::number(dis));}void MainWindow::pushbutton1(){path=ui->filename->toPlainText();board_size.width=ui->cols->value();board_size.height=ui->rows->value();square_size.width=square_size.height=ui->dis->value();imageCount=ui->pic->value();squareCalibrate();QString text("%1x+%2y+%3z\n=%4");text=text.arg(plane12[0]).arg(plane12[1]).arg(plane12[2]).arg(plane12[3]);ui->surface->setText(text);}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- pytorch 中矩阵乘法总结
pytorch 中矩阵乘法总结...
2024/4/28 2:06:46 - 关于java编码出现:Invalid escape sequence (valid ones are \b \t \n \f \r \“ \‘ \\ )这样的问题
这个是转义字符的问题~~~~~~下面是网上的解释: 根据Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字…...
2024/4/25 18:03:52 - JavaScript(BOM对象的操作)
BOM对象的操作BOM:浏览器对象模型windowNavigatorscreenlocationhistoryBOM:浏览器对象模型 window 全局对象 window.alert(1);\\弹窗警告 \\获取浏览器窗口内外部边框数据 window.innerHeight; window.innerWidth; window.outerHeight window.outerW…...
2024/4/18 16:48:26 - 文件读取求平均值
项目场景: 提示:这里简述项目相关背景: python练习题 问题描述: 提示:这里描述项目中遇到的问题: 附件提供了一个传感器日志文件sensor-data-1k.txt,为文本类型,共 1 千行&#…...
2024/4/20 23:13:25 - 叹服,网易JDK负责人手写 HotSpot 358页实战笔记
前言 不知道各位同学发现了没有:现在对于Java开发岗位需求仍旧是需求大于供给,但是就是这样的情况还是很多同学找不到心仪的工作。究其原因就会发现:现在招聘的要求是不仅仅是要会应用,同时更要明白其中的内部运行原理࿰…...
2024/4/20 8:04:35 - 银河麒麟v10 安装 postgis
先安装postgresql 开源数据库postgreSQL13在麒麟v10sp1源码安装 安装geos wget http://download.osgeo.org/geos/geos-3.8.0.tar.bz2 tar -xjf geos-3.8.0.tar.bz2 cd geos-3.8.0 ./configure --prefix/opt/geos-3.8.0 --enable-python make sudo make install安装 sqlite y…...
2024/4/28 3:21:48 - 归并排序算法的过程图解
归并排序1 你会学到什么2 讨论的问题是什么3 相关的概念和理论4 归并排序过程详解 归并简介 二路归并 二路归并演示 总体思路 完整例子5 算法评价6 总结欢迎关注算法channel公众号归并排序归并排序是分而治之思想的典型应用。1 你会学到什么?彻底弄明白常用的排序算法的基本思…...
2024/4/20 20:44:36 - js 获取url参数
getUrlData(qs) {var urlData location.href;urlData urlData.replace("?", "?&").split("&");var result "";for (let i 1; i < urlData.length; i) {if (urlData[i].indexOf(qs "") 0) {result urlDa…...
2024/4/27 7:39:45 - Spring Cloud Alibaba 2.X 简易集成 Skywalking 实现微服务链路追踪
文章目录1 摘要2 Skywalking 所需条件3 下载 Skywalking3 服务配置与说明4 与 SpringBoot 项目集成5 控制台使用说明6 推荐参考资料7 Github 源码 1 摘要 为什么要做链路追踪?当微服务的数量庞大、微服务之间相互调用复杂的时候,就需要做链路追踪…...
2024/4/28 9:10:31 - 排序算法之直接插入排序和希尔排序
相信许多人和我一样,排序算法看了好几遍,当时看懂了,过几天一些细节又忘记,所以现在讲排序算法做一个总结,从最基本的排序算法展开来,首先分析直接插入排序和希尔排序。 1.直接插入排序 思想:把一个数插入到已经排序的有序序列中; 方法:将这个数与有序序列自右向左…...
2024/4/28 1:25:20 - Theano安装
11-03 在运行GE的代码 踩了三天的坑啊,theano一定不要用pip装... 用conda创建虚拟环境conda create -n venv_name python3.7 再conda install theano...
2024/4/20 23:23:13 - jQuery使用(一)---简单使用
jQuery基础: function changeValue(a){//一些常用的 HTML DOM 方法:// getElementById(id) - 获取带有指定 id 的节点(元素)// appendChild(node) - 插入新的子节点(元素)// removeChild(node) - 删除子节…...
2024/4/27 9:58:05 - 赵神牛的游戏
题目描述 在 DNF 中,赵神牛有一个缔造者,他一共有 k 点法力值,一共有 m 个技能,每个技能耗费的法力值为 ai,可以造成的伤害为 bi ,而 boss 的体力值为 n,请你求出它放哪个技能,才可…...
2024/4/28 0:22:03 - PID tuning guide
最近在学习PID控制算法参数的调节,根据看的matlab的视频做了一些记录。 PID算法 是将 偏差 的 比例( P roportion)、积分( I ntegral) 和 微分( D ifferential) 通过线性组合构成控制量…...
2024/4/22 15:34:57 - 安装gunicorn
pip install gunicorn 查看命令行选项: 安装gunicorn成功后,通过命令行的方式可以查看gunicorn的使用信息。 $ gunicorn -h 直接运行: # 直接运行,默认启动的127.0.0.1::8000 $ gunicorn 运行文件名称:Flask程序实例名 指定进…...
2024/4/28 5:21:08 - Python 正则表达式-语义化正则
Python 正则表达式 python的正则表达式是在re模块,属于内置模块。正则表达式格式的详细说明见文章结束表, 模式的构建通过pattern re.compile(regex_str, flag)构建,下面是python正则常用的函数。 python 正则函数函数用法说明p re.compile…...
2024/4/28 7:01:27 - 多层嵌套对象得取值和赋值问题
1.多层嵌套对象得取值。 let obj {core:{sys_model:55},detector:{conv:11,gap_width:15} } 取值 obj.core.sys_model >552.多层嵌套对象得赋值 let obj {core:{sys_model:55},detector:{conv:11,gap_width:15} } obj.core.sys_model 55 //直接赋值3.如果要修改得参数过多…...
2024/4/28 8:09:18 - 重启IIS服务批处理脚本
echo off echo 开始执行任务:%Time% C:\Windows\System32\inetsrv\appcmd.exe stop site StarWeb echo 延迟3秒:%Time% cd C:\ & timeout /t 3 echo 继续:%Time% C:\Windows\System32\inetsrv\appcmd.exe start site StarWeb echo 完成…...
2024/4/28 8:46:01 - junit 出现 initializationerror错误
junit单元测试所测试的方法必须是没有参数,无返回值,是公开的,可以抛出异常。 每个 JUnit test 方法应该是无状态的,无状态就是说,我们以任何次序和次数去调用某个方法,它给出的结果在参数相同的情况下结果应该完全相同, 如果我们在测试过程中记住了某个”状态“变量再去…...
2024/4/28 9:19:00 - springboot项目创建笔记30 之《发送邮件服务》
1、pom文件添加依赖 <!-- 邮件发送 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 2、添加邮件服务类MailService.java 建立包:com.…...
2024/4/27 21:27:48
最新文章
- 【进阶六】Python实现SDVRPTW(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)
基于python语言,采用经典禁忌搜索(TS)模拟退火(SA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时…...
2024/4/28 12:03:46 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 条件变量的使用(golang)
1、背景 最近在学习go的一个开源协程池,在源码中有用到锁、信号量,锁相对来说用的是比较多的,信号量相对用的较少,之前研究学习过c的std::condition_variable,其实和golang的大同小异,个人感觉c的略强…...
2024/4/27 12:51:55 - 如何转行成为产品经理?
转行NPDP也是很合适的一条发展路径,之后从事新产品开发相关工作~ 一、什么是NPDP? NPDP 是产品经理国际资格认证,美国产品开发与管理协会(PDMA)发起的,是目前国际公认的唯一的新产品开发专业认证ÿ…...
2024/4/22 16:14:13 - 谷歌(Google)技术面试——在线评估问题(一)
谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处,还提供了有关 Google 面试不…...
2024/4/25 22:36:30 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57