精华内容
下载资源
问答
  • 用户反馈流程评价、评论流程

    千次阅读 2019-06-11 18:47:29
    在购买或体验产品或商品服务后,用户将根据他们的经验发表评论和评论。 评价模块通常用于商品或服务的反馈。对于电子商务和生活服务等第三方平台,评估模块有助于...这次分享的「评价/评论流程」主要来自 天猫 ...

    在购买或体验产品或商品服务后,用户将根据他们的经验发表评论和评论。

     

    评价模块通常用于商品或服务的反馈。对于电子商务和生活服务等第三方平台,评估模块有助于提高交易转换率并优化用户体验。

     

    评论模块通常用于UGC社区产品。对于社交,轻社区 C端产品,评论模块是UGC输出的重要来源,它有助于改善用户活动并加强平台和用户,用户和用户的联系。

    这次分享的「评价/评论流程」主要来自

    天猫

    饿了吗

    网易云音乐

    他们的评价和评论功能代表了类似的产品。

     

    例如,在电子商务行业中,天猫产品评估过程相对完善。在轻社区产品中,网易云音乐的评论功能是产品成功的重要因素之一。

     

    天猫

     

     

    饿了吗

     

    网易云音乐

     

    联系可获取“天猫、饿了吗、网易云音乐”评论、评论主要页面

    展开全文
  • 电商评价分析流程

    千次阅读 2018-04-03 10:52:06
    电商评论分析除了人工数据进行分析撰写分析报告,还有就是电商评价采集分析系统通过采集大量评论数据并提炼出其中蕴涵的信息,为品牌方全面、准确得了解产品及消费者提供支持,以便及时进行针对性优化调整。...

    电商评论分析除了人工对数据进行分析撰写分析报告,还有就是电商评价采集分析系统通过采集大量评论数据并提炼出其中蕴涵的信息,为品牌方全面、准确得了解产品及消费者提供支持,以便及时进行针对性优化调整。两者相比,采用系统来分析会比人工分析更精准、分析维度更全面。

       机器电商评价分析流程基本如下:1.数据采集。通过大数据采集技术抓取信息;2.数据清洗。通过页面结构等技术自动去除垃圾信息,人工核查;3.数据编码。将文本数据统一编码进行标准化,形成结构化数据;4.数据分析。智能机器学习,将数据分类,运用统计模型进行品牌提及、产品、价格、服务等方面的分析计算;5.报告撰写。根据数据结果撰写分析报告,将报告发送客户,或上传系统后台,随用随看。

       以上电商评价流程转载antuodata通用流程处,里面细节操作还是要根据公司实际情况细节化。

    展开全文
  • 评价-土地资源评价流程

    千次阅读 2019-08-26 13:39:32
    按照《资源环境承载能力和国土空间开发适宜性评价技术指南(试行)》附件所示,评价方法和步骤进行数据处理: 1 准备30M地形数据,转GCS2000坐标系;定义投影,生成坡度图 2 准备河流水系数据 (1)河流线数据、...

    按照《资源环境承载能力和国土空间开发适宜性评价技术指南(试行)》附件所示,评价方法和步骤进行数据处理:

    1  准备30M地形数据,转GCS2000坐标系;定义投影,生成坡度图

    2  准备河流水系数据

      (1)河流线数据、湖泊面数据转GCS2000坐标系;

     (2) 按河流级别,设定不同级别河流的缓冲区;

    (3)河流缓冲区数据 转栅格gdal.RasterizeLayer();栅格的六参数与地形数据一致

    (4)水域面数据转栅格,栅格的六参数与地形数据一致

    3. 准备土壤质地数据,重采样使土壤质地的六参数与地形数据一致

    4.由地形数据计算地形起伏度

    5. 按照评价方法,将栅格数据按相应规按等级赋值

    6.根据附件指南中的图例设置颜色,使用BufferedImage进行绘图,绘图时计算区域的水平和垂直方向网格数,取Math.Ceil(最大值/1000.0)*1000为绘图区域大小,右侧添加图例、指北针、标题、比例尺

    展开全文
  • 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。 相机标定的输入:标定图像上所有内角...

    使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些?

     

    相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。

    相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。

    相机标定的输出:摄像机的内参、外参系数。

     

    这三个基础的问题就决定了使用Opencv实现张正友法标定相机的标定流程、标定结果评价以及使用标定结果矫正原始图像的完整流程:

     

    1. 准备标定图片

    2. 对每一张标定图片,提取角点信息

    3. 对每一张标定图片,进一步提取亚像素角点信息

    4. 在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)

    5. 相机标定

    6. 对标定结果进行评价

    7. 查看标定效果——利用标定结果对棋盘图进行矫正

     

    1. 准备标定图片

     

    标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄,最少需要3张,以10~20张为宜。标定板需要是黑白相间的矩形构成的棋盘图,制作精度要求较高,如下图所示:

     

     

     

    2.对每一张标定图片,提取角点信息

     

    需要使用findChessboardCorners函数提取角点,这里的角点专指的是标定板上的内角点,这些角点与标定板的边缘不接触。

     findChessboardCorners函数原型:

     

    //! finds checkerboard pattern of the specified size in the image
    CV_EXPORTS_W bool findChessboardCorners( InputArray image, Size patternSize,
                                             OutputArray corners,
                                             int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE );

     

    第一个参数Image,传入拍摄的棋盘图Mat图像,必须是8位的灰度或者彩色图像;

    第二个参数patternSize,每个棋盘图上内角点的行列数,一般情况下,行列数不要相同,便于后续标定程序识别标定板的方向;

    第三个参数corners,用于存储检测到的内角点图像坐标位置,一般用元素是Point2f的向量来表示:vector<Point2f> image_points_buf;

    第四个参数flage:用于定义棋盘图上内角点查找的不同处理方式,有默认值。

     

     

     

    3. 对每一张标定图片,进一步提取亚像素角点信息

     

     

     

    为了提高标定精度,需要在初步提取的角点信息上进一步提取亚像素信息,降低相机标定偏差,常用的方法是cornerSubPix,另一个方法是使用find4QuadCornerSubpix函数,这个方法是专门用来获取棋盘图上内角点的精确位置的,或许在相机标定的这个特殊场合下它的检测精度会比cornerSubPix更高?

    cornerSubPix函数原型:

     

    //! adjusts the corner locations with sub-pixel accuracy to maximize the certain cornerness criteria
    CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners,
                                    Size winSize, Size zeroZone,
                                    TermCriteria criteria );

     

    第一个参数image,输入的Mat矩阵,最好是8位灰度图像,检测效率更高;

     

    第二个参数corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector<Point2f/Point2d> iamgePointsBuf;

    第三个参数winSize,大小为搜索窗口的一半;

    第四个参数zeroZone,死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现某些可能的奇异性。当值为(-1,-1)时表示没有死区;

    第五个参数criteria,定义求角点的迭代过程的终止条件,可以为迭代次数和角点精度两者的组合;

    find4QuadCornerSubpix函数原型:

     

    //! finds subpixel-accurate positions of the chessboard corners
    CV_EXPORTS bool find4QuadCornerSubpix(InputArray img, InputOutputArray corners, Size region_size);

     

    第一个参数img,输入的Mat矩阵,最好是8位灰度图像,检测效率更高;

     

     

    第二个参数corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector<Point2f/Point2d> iamgePointsBuf;

    第三个参数region_size,角点搜索窗口的尺寸;

    在其中一个标定的棋盘图上分别运行cornerSubPix和find4QuadCornerSubpix寻找亚像素角点,两者定位到的亚像素角点坐标分别为:

     

       cornerSubPix:                                                 find4QuadCornerSubpix:

                           

     

    虽然有一定差距,但偏差基本都控制在0.5个像素之内。

     

     

    4. 在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)

     

     

    drawChessboardCorners函数用于绘制被成功标定的角点,函数原型:

     

     

    //! draws the checkerboard pattern (found or partly found) in the image
    CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSize,
                                             InputArray corners, bool patternWasFound );

     

    第一个参数image,8位灰度或者彩色图像;

    第二个参数patternSize,每张标定棋盘上内角点的行列数;

    第三个参数corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector<Point2f/Point2d> iamgePointsBuf;

    第四个参数patternWasFound,标志位,用来指示定义的棋盘内角点是否被完整的探测到,true表示别完整的探测到,函数会用直线依次连接所有的内角点,作为一个整体,false表示有未被探测到的内角点,这时候函数会以(红色)圆圈标记处检测到的内角点;

    以下是drawChessboardCorners函数中第四个参数patternWasFound设置为true和false时内角点的绘制效果:

    patternWasFound=ture时,依次连接各个内角点:

     


     

    patternWasFound=false时,以(红色)圆圈标记处角点位置:

     

     

     

    5. 相机标定

     

     

    获取到棋盘标定图的内角点图像坐标之后,就可以使用calibrateCamera函数进行标定,计算相机内参和外参系数,

    calibrateCamera函数原型:

     

    //! finds intrinsic and extrinsic camera parameters from several fews of a known calibration pattern.
    CV_EXPORTS_W double calibrateCamera( InputArrayOfArrays objectPoints,
                                         InputArrayOfArrays imagePoints,
                                         Size imageSize,
                                         CV_OUT InputOutputArray cameraMatrix,
                                         CV_OUT InputOutputArray distCoeffs,
                                         OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,
                                         int flags=0, TermCriteria criteria = TermCriteria(
                                             TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) );

     

    第一个参数objectPoints,为世界坐标系中的三维点。在使用时,应该输入一个三维坐标点的向量的向量,即vector<vector<Point3f>> object_points。需要依据棋盘上单个黑白矩阵的大小,计算出(初始化)每一个内角点的世界坐标。

     

    第二个参数imagePoints,为每一个内角点对应的图像坐标点。和objectPoints一样,应该输入vector<vector<Point2f>> image_points_seq形式的变量;

    第三个参数imageSize,为图像的像素尺寸大小,在计算相机的内参和畸变矩阵时需要使用到该参数;

    第四个参数cameraMatrix为相机的内参矩阵。输入一个Mat cameraMatrix即可,如Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0));

    第五个参数distCoeffs为畸变矩阵。输入一个Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))即可;

    第六个参数rvecs为旋转向量;应该输入一个Mat类型的vector,即vector<Mat>rvecs;

    第七个参数tvecs为位移向量,和rvecs一样,应该为vector<Mat> tvecs;

    第八个参数flags为标定时所采用的算法。有如下几个参数:

    CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,u0,v0的估计值。否则的话,将初始化(u0,v0)图像的中心点,使用最小二乘估算出fx,fy。 
    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_RATIONAL_MODEL:计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。

    第九个参数criteria是最优迭代终止条件设定。

    在使用该函数进行标定运算之前,需要对棋盘上每一个内角点的空间坐标系的位置坐标进行初始化,标定的结果是生成相机的内参矩阵cameraMatrix、相机的5个畸变系数distCoeffs,另外每张图像都会生成属于自己的平移向量和旋转向量。

     

     

    6. 对标定结果进行评价

     

     

    对标定结果进行评价的方法是通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到空间三维点在图像上新的投影点的坐标,计算投影坐标和亚像素角点坐标之间的偏差,偏差越小,标定结果越好。

    对空间三维坐标点进行反向投影的函数是projectPoints,函数原型是:

     

    //! projects points from the model coordinate space to the image coordinates. Also computes derivatives of the image coordinates w.r.t the intrinsic and extrinsic camera parameters
    CV_EXPORTS_W void projectPoints( InputArray objectPoints,
                                     InputArray rvec, InputArray tvec,
                                     InputArray cameraMatrix, InputArray distCoeffs,
                                     OutputArray imagePoints,
                                     OutputArray jacobian=noArray(),
                                     double aspectRatio=0 );

     

    第一个参数objectPoints,为相机坐标系中的三维点坐标;

     

    第二个参数rvec为旋转向量,每一张图像都有自己的选择向量;

    第三个参数tvec为位移向量,每一张图像都有自己的平移向量;

    第四个参数cameraMatrix为求得的相机的内参数矩阵;

    第五个参数distCoeffs为相机的畸变矩阵;

    第六个参数iamgePoints为每一个内角点对应的图像上的坐标点;

    第七个参数jacobian是雅可比行列式;

    第八个参数aspectRatio是跟相机传感器的感光单元有关的可选参数,如果设置为非0,则函数默认感光单元的dx/dy是固定的,会依此对雅可比矩阵进行调整;

    下边显示了某一张标定图片上的亚像素角点坐标和根据标定结果把空间三维坐标点映射回图像坐标点的对比:

     

    find4QuadCornerSubpix查找到的亚像素点坐标:                           projectPoints映射的坐标:

                                                         

     

    以下是每一幅图像上24个内角点的平均误差统计数据:

     

     

    7. 查看标定效果——利用标定结果对棋盘图进行矫正

     

     

    利用求得的相机的内参和外参数据,可以对图像进行畸变的矫正,这里有两种方法可以达到矫正的目的,分别说明一下。

    方法一:使用initUndistortRectifyMap和remap两个函数配合实现。

    initUndistortRectifyMap用来计算畸变映射,remap把求得的映射应用到图像上。

    initUndistortRectifyMap的函数原型:

     

    //! initializes maps for cv::remap() to correct lens distortion and optionally rectify the image
    CV_EXPORTS_W void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,
                               InputArray R, InputArray newCameraMatrix,
                               Size size, int m1type, OutputArray map1, OutputArray map2 );

     

    第一个参数cameraMatrix为之前求得的相机的内参矩阵;

    第二个参数distCoeffs为之前求得的相机畸变矩阵;

    第三个参数R,可选的输入,是第一和第二相机坐标之间的旋转矩阵;

    第四个参数newCameraMatrix,输入的校正后的3X3摄像机矩阵;

    第五个参数size,摄像机采集的无失真的图像尺寸;

    第六个参数m1type,定义map1的数据类型,可以是CV_32FC1或者CV_16SC2;

    第七个参数map1和第八个参数map2,输出的X/Y坐标重映射参数;

     

    remap函数原型:

     

    //! warps the image using the precomputed maps. The maps are stored in either floating-point or integer fixed-point format
    CV_EXPORTS_W void remap( InputArray src, OutputArray dst,
                             InputArray map1, InputArray map2,
                             int interpolation, int borderMode=BORDER_CONSTANT,
                             const Scalar& borderValue=Scalar());

     

    第一个参数src,输入参数,代表畸变的原始图像;

     

    第二个参数dst,矫正后的输出图像,跟输入图像具有相同的类型和大小;

    第三个参数map1和第四个参数map2,X坐标和Y坐标的映射;

    第五个参数interpolation,定义图像的插值方式;

    第六个参数borderMode,定义边界填充方式;

     

    方法二:使用undistort函数实现

    undistort函数原型:

     

    //! corrects lens distortion for the given camera matrix and distortion coefficients
    CV_EXPORTS_W void undistort( InputArray src, OutputArray dst,
                                 InputArray cameraMatrix,
                                 InputArray distCoeffs,
                                 InputArray newCameraMatrix=noArray() );

     

    第一个参数src,输入参数,代表畸变的原始图像;

     

     

    第二个参数dst,矫正后的输出图像,跟输入图像具有相同的类型和大小;

    第三个参数cameraMatrix为之前求得的相机的内参矩阵;

    第四个参数distCoeffs为之前求得的相机畸变矩阵;

    第五个参数newCameraMatrix,默认跟cameraMatrix保持一致;

    方法一相比方法二执行效率更高一些,推荐使用。

     

    以下是使用某一张标定图使用方法一和方法二进行矫正的效果图对比。

    原始标定图像:

     

    方法一,使用initUndistortRectifyMap和remap实现矫正效果:

     

    方法二,使用undistort函数实现矫正效果:

     

    两个方法从矫正效果上看,结果是一致的。

     

    以下是完整的工程代码:

     

     

    #include "opencv2/core/core.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/calib3d/calib3d.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    #include <fstream>
    
    using namespace cv;
    using namespace std;
    
    void main() 
    {
    	ifstream fin("calibdata.txt"); /* 标定所用图像文件的路径 */
    	ofstream fout("caliberation_result.txt");  /* 保存标定结果的文件 */	
    	//读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化	
    	cout<<"开始提取角点………………";
    	int image_count=0;  /* 图像数量 */
    	Size image_size;  /* 图像的尺寸 */
    	Size board_size = Size(4,6);    /* 标定板上每行、列的角点数 */
    	vector<Point2f> image_points_buf;  /* 缓存每幅图像上检测到的角点 */
    	vector<vector<Point2f>> image_points_seq; /* 保存检测到的所有角点 */
    	string filename;
    	int count= -1 ;//用于存储角点个数。
    	while (getline(fin,filename))
    	{
    		image_count++;		
    		// 用于观察检验输出
    		cout<<"image_count = "<<image_count<<endl;		
    		/* 输出检验*/
    		cout<<"-->count = "<<count;		
    		Mat imageInput=imread(filename);
    		if (image_count == 1)  //读入第一张图片时获取图像宽高信息
    		{
    			image_size.width = imageInput.cols;
    			image_size.height =imageInput.rows;			
    			cout<<"image_size.width = "<<image_size.width<<endl;
    			cout<<"image_size.height = "<<image_size.height<<endl;
    		}
    
    		/* 提取角点 */
    		if (0 == findChessboardCorners(imageInput,board_size,image_points_buf))
    		{			
    			cout<<"can not find chessboard corners!\n"; //找不到角点
    			exit(1);
    		} 
    		else 
    		{
    			Mat view_gray;
    			cvtColor(imageInput,view_gray,CV_RGB2GRAY);
    			/* 亚像素精确化 */
    			find4QuadCornerSubpix(view_gray,image_points_buf,Size(5,5)); //对粗提取的角点进行精确化
    			//cornerSubPix(view_gray,image_points_buf,Size(5,5),Size(-1,-1),TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));
    			image_points_seq.push_back(image_points_buf);  //保存亚像素角点
    			/* 在图像上显示角点位置 */
    			drawChessboardCorners(view_gray,board_size,image_points_buf,false); //用于在图片中标记角点
    			imshow("Camera Calibration",view_gray);//显示图片
    			waitKey(500);//暂停0.5S		
    		}
    	}
    	int total = image_points_seq.size();
    	cout<<"total = "<<total<<endl;
    	int CornerNum=board_size.width*board_size.height;  //每张图片上总的角点数
    	for (int ii=0 ; ii<total ;ii++)
    	{
    		if (0 == ii%CornerNum)// 24 是每幅图片的角点个数。此判断语句是为了输出 图片号,便于控制台观看 
    		{	
    			int i = -1;
    			i = ii/CornerNum;
    			int j=i+1;
    			cout<<"--> 第 "<<j <<"图片的数据 --> : "<<endl;
    		}
    		if (0 == ii%3)	// 此判断语句,格式化输出,便于控制台查看
    		{
    			cout<<endl;
    		}
    		else
    		{
    			cout.width(10);
    		}
    		//输出所有的角点
    		cout<<" -->"<<image_points_seq[ii][0].x;
    		cout<<" -->"<<image_points_seq[ii][0].y;
    	}	
    	cout<<"角点提取完成!\n";
    
    	//以下是摄像机标定
    	cout<<"开始标定………………";
    	/*棋盘三维信息*/
    	Size square_size = Size(10,10);  /* 实际测量得到的标定板上每个棋盘格的大小 */
    	vector<vector<Point3f>> object_points; /* 保存标定板上角点的三维坐标 */
    	/*内外参数*/
    	Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0)); /* 摄像机内参数矩阵 */
    	vector<int> point_counts;  // 每幅图像中角点的数量
    	Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0)); /* 摄像机的5个畸变系数:k1,k2,p1,p2,k3 */
    	vector<Mat> tvecsMat;  /* 每幅图像的平移向量 */
    	vector<Mat> rvecsMat; /* 每幅图像的旋转向量 */
    	/* 初始化标定板上角点的三维坐标 */
    	int i,j,t;
    	for (t=0;t<image_count;t++) 
    	{
    		vector<Point3f> tempPointSet;
    		for (i=0;i<board_size.height;i++) 
    		{
    			for (j=0;j<board_size.width;j++) 
    			{
    				Point3f realPoint;
    				/* 假设标定板放在世界坐标系中z=0的平面上 */
    				realPoint.x = i*square_size.width;
    				realPoint.y = j*square_size.height;
    				realPoint.z = 0;
    				tempPointSet.push_back(realPoint);
    			}
    		}
    		object_points.push_back(tempPointSet);
    	}
    	/* 初始化每幅图像中的角点数量,假定每幅图像中都可以看到完整的标定板 */
    	for (i=0;i<image_count;i++)
    	{
    		point_counts.push_back(board_size.width*board_size.height);
    	}	
    	/* 开始标定 */
    	calibrateCamera(object_points,image_points_seq,image_size,cameraMatrix,distCoeffs,rvecsMat,tvecsMat,0);
    	cout<<"标定完成!\n";
    	//对标定结果进行评价
    	cout<<"开始评价标定结果………………\n";
    	double total_err = 0.0; /* 所有图像的平均误差的总和 */
    	double err = 0.0; /* 每幅图像的平均误差 */
    	vector<Point2f> image_points2; /* 保存重新计算得到的投影点 */
    	cout<<"\t每幅图像的标定误差:\n";
    	fout<<"每幅图像的标定误差:\n";
    	for (i=0;i<image_count;i++)
    	{
    		vector<Point3f> tempPointSet=object_points[i];
    		/* 通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的投影点 */
    		projectPoints(tempPointSet,rvecsMat[i],tvecsMat[i],cameraMatrix,distCoeffs,image_points2);
    		/* 计算新的投影点和旧的投影点之间的误差*/
    		vector<Point2f> tempImagePoint = image_points_seq[i];
    		Mat tempImagePointMat = Mat(1,tempImagePoint.size(),CV_32FC2);
    		Mat image_points2Mat = Mat(1,image_points2.size(), CV_32FC2);
    		for (int j = 0 ; j < tempImagePoint.size(); j++)
    		{
    			image_points2Mat.at<Vec2f>(0,j) = Vec2f(image_points2[j].x, image_points2[j].y);
    			tempImagePointMat.at<Vec2f>(0,j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);
    		}
    		err = norm(image_points2Mat, tempImagePointMat, NORM_L2);
    		total_err += err/=  point_counts[i];   
    		std::cout<<"第"<<i+1<<"幅图像的平均误差:"<<err<<"像素"<<endl;   
    		fout<<"第"<<i+1<<"幅图像的平均误差:"<<err<<"像素"<<endl;   
    	}   
    	std::cout<<"总体平均误差:"<<total_err/image_count<<"像素"<<endl;   
    	fout<<"总体平均误差:"<<total_err/image_count<<"像素"<<endl<<endl;   
    	std::cout<<"评价完成!"<<endl;  
    	//保存定标结果  	
    	std::cout<<"开始保存定标结果………………"<<endl;       
    	Mat rotation_matrix = Mat(3,3,CV_32FC1, Scalar::all(0)); /* 保存每幅图像的旋转矩阵 */
    	fout<<"相机内参数矩阵:"<<endl;   
    	fout<<cameraMatrix<<endl<<endl;   
    	fout<<"畸变系数:\n";   
    	fout<<distCoeffs<<endl<<endl<<endl;   
    	for (int i=0; i<image_count; i++) 
    	{ 
    		fout<<"第"<<i+1<<"幅图像的旋转向量:"<<endl;   
    		fout<<rvecsMat[i]<<endl;    
    		/* 将旋转向量转换为相对应的旋转矩阵 */   
    		Rodrigues(rvecsMat[i],rotation_matrix);   
    		fout<<"第"<<i+1<<"幅图像的旋转矩阵:"<<endl;   
    		fout<<rotation_matrix<<endl;   
    		fout<<"第"<<i+1<<"幅图像的平移向量:"<<endl;   
    		fout<<tvecsMat[i]<<endl<<endl;   
    	}   
    	std::cout<<"完成保存"<<endl; 
    	fout<<endl;
    	/************************************************************************  
    	显示定标结果  
    	*************************************************************************/
    	Mat mapx = Mat(image_size,CV_32FC1);
    	Mat mapy = Mat(image_size,CV_32FC1);
    	Mat R = Mat::eye(3,3,CV_32F);
    	std::cout<<"保存矫正图像"<<endl;
    	string imageFileName;
    	std::stringstream StrStm;
    	for (int i = 0 ; i != image_count ; i++)
    	{
    		std::cout<<"Frame #"<<i+1<<"..."<<endl;
    		initUndistortRectifyMap(cameraMatrix,distCoeffs,R,cameraMatrix,image_size,CV_32FC1,mapx,mapy);		
    		StrStm.clear();
    		imageFileName.clear();
    		string filePath="chess";
    		StrStm<<i+1;
    		StrStm>>imageFileName;
    		filePath+=imageFileName;
    		filePath+=".bmp";
    		Mat imageSource = imread(filePath);
    		Mat newimage = imageSource.clone();
    		//另一种不需要转换矩阵的方式
    		//undistort(imageSource,newimage,cameraMatrix,distCoeffs);
    		remap(imageSource,newimage,mapx, mapy, INTER_LINEAR);		
    		StrStm.clear();
    		filePath.clear();
    		StrStm<<i+1;
    		StrStm>>imageFileName;
    		imageFileName += "_d.jpg";
    		imwrite(imageFileName,newimage);
    	}
    	std::cout<<"保存结束"<<endl;	
    	return ;
    }

     

     

    标定图例1:

     

    标定图例2:

     

    标定结果1:

     

    标定结果2:

     

    矫正效果1:

     

    矫正效果2:

     

    以上程序已经是完整程序,需要棋盘标定图或者整个项目包的可以到这里下载:张正友相机标定Opencv实现(完整程序+棋盘图)

     

    展开全文
  • 最近在学习利用Python的Sklearn模块实现数据的回归,分类,以及聚类任务,并分别其结果进行指标分析。这一篇主要是总结数据的回归预测,写这篇文章的主要目的是理顺思路,方便以后查找使用。 数据的回归...
  • 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。 相机标定的输入:标定图像上所有内角...
  • 今天开始学习使用FastQC软件范例SRA测序文件的质量进行分析。数据质控是一个综合的评价标准,其中主要指标为碱基质量与含量分布,如果这两个指标合格,后面大部分指标都可以通过;如果这两项不合格,其余都会受到...
  • 初入职场时,我们会公司进行比较,在众多优秀公司面前,我们会面试多家,最后选择自己心仪的公司,不是每个人都能遇到好运气,有一些人为了等到自己心仪的公司,却错过了其他公司,错失良机,是职场员工犯得大忌。...
  • 本篇博客主要介绍DWA算法所采用的评价函数中障碍物相关的评价函数 轨迹主要依据以下三条准则进行评分,综合评分后选取分数最小的路径作为下一时刻选择路径: Obstacle_costs 轨迹上是否存在障碍物以及距离障碍物...
  • [机器学习]hypothesis的评价方式

    千次阅读 2015-03-22 18:01:11
    机器学习算法的主要用途之一就是 预测。...当数据通过 算法训练得到一个hypothesis之后,我们要用这个hypothesis新的数据进行预测,那么在此之前,我们先要这个hypothesis进行评估,判断它是否是一个好的h
  • 来自 参考 原始数据 也就是两列数据,一列是时间,一列是电力消耗量: Datetime,PJME_MW 2002-12-31 01:00:00,26498.0 2002-12-31 02:00:00,25147.0 ...评价 RMSE: 均方根误差(Root Mean Square Error)
  • 开发流程模型

    千次阅读 2016-10-18 10:15:11
    快速原型模型的第一步是建造一个快速原型,实现客户或未来的用户与系统的交互,用户或客户原型进行评价,进一步细化待开发软件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么...
  • 采样轨迹进行评价时,需要当前costmap进行预计算: /**** @预计算 @goal_costs: 计算轨迹路径计算地图中所有点到局部地图末端点的最短距离 @path_costs: 计算轨迹路径计算地图中所有点到整个局部地图路径...
  • 数据挖掘基本流程

    千次阅读 2019-05-12 13:10:13
    数据挖掘基本流程 数据挖掘基本流程: 商业理解:从商业的角度理解项目需求,通过数据挖掘来帮助业务。...模型评估:模型进行评价,并检查模型的每个步骤,确认模型是否实现商业目标。 上线发布:通过数据挖...
  • 处理流程和数据流程

    千次阅读 热门讨论 2015-06-27 11:22:08
    处理流程如下:  管理员登录系统,可以“设定基本数据”、“修改密码”、“查看操作员工作记录”以及“增加和删除用户”,然后,给学生进行“注册”,注册后,操作员可以进行“学生基本信息维护”,学生可以进行...
  • 小程序开发订单评价和商家评价

    千次阅读 2019-03-27 14:37:24
    小程序做线上商城就离不开交互,包括最重要的支付和订单评价系统。订单评价简单的只有商品评价,比较齐全的是商品和商家一起评价。 本文介绍的目录包含,商品评价,商家评价,星级评分,上传照片,以及评论字数限制...
  • 业务流程图的绘制流程分享(一)

    万次阅读 2018-03-25 09:14:46
    前言:近来一段时间,忙于整理业务流程图,期间,关于流程图的绘制方法和工具也与内部团队和外部做了心得交流,恰好,...所以就整理成文,如果恰好你有所帮助,那是真真好的。真实整理的流程牵涉到公司未公布的...
  • IPD流程

    万次阅读 2019-06-22 14:28:32
    (1)集成组合管理团队(IPMT):产品投资决策和评审机构,负责制定公司总的使命愿景和战略方向,并新产品线的产生进行决策。通常是一个高层跨部门团队,成员包括各个部门最高主管。 (2)产品开发团队...
  • 数据挖掘的理解和项目流程

    千次阅读 2018-08-22 15:54:41
     效果评价测试效果进行评估分析,判断模型是否满足商业目标  营销建议,根据试用效果提取营销规则并给出营销建议  【实施要点】  合适的业务场景试用方案  全面科学的效果评价  针对性的...
  • 流程设计:饿了么下单到收餐流程

    千次阅读 2019-12-08 14:12:22
    题目:假设你在使用饿了么,从一个用户下单到收餐,对应的整个场景的流程状态,请你用产品经理的方式做...3.用户的相关权限:下单、支付、催单、退单、评价,至少3点要在流程图中体现 4.店铺的相关权限:通知骑手来...
  • 流程执行效果如何评估

    千次阅读 2019-01-14 10:37:25
     经常在各种文档上看到如下的内容:XXX项目的应急预案、某某某的申请流程。凡事按流程办事,几乎无处不在。在整个流程执行过程中,经常遇到下面的问题: 某某某流程落地执行太难了,大家都不愿意配合执行 某某某...
  • 软件测试工作流程概括与总结

    万次阅读 多人点赞 2018-08-08 23:37:45
    最近在为面试新工作做准备,所以想想整理一下软件测试的基本工作流程,大致梳理一遍,这样也便于自己在面试过程中可以沉着的面对面试管的测试工作如何进行的问题。 首先,作为测试人员需要学习并了解业务,分析需求...
  • 软件项目开发流程

    千次阅读 多人点赞 2019-10-08 05:30:56
    1.需求分析: 通过客户业务的了解和与客户对流程的讨论需求进行基本建模,最终形成需求规格说明书。 2.总体设计: 通过分析需求信息,系统的外部条件及内部业务需求进行抽象建模,最终形成概要设计说明文档...
  • 机器学习(概述二)——开发流程

    万次阅读 2019-06-05 02:12:00
    在具体的机器学习算法之前,先来从宏观上介绍一下机器学习的开发流程,这样能机器学习有个整体认识。 总的来说,分为数据收集、数据处理、模型构建、模型测试评估、投入使用(模型部署与整合)、迭代优化等。对于...
  • 流程图绘制心得

    千次阅读 2017-06-26 17:04:35
    网页制作Webjx文章简介:一个哥们在MSN上告诉我,他们公司的交互设计师只产出流程图,并问我用什么标准评价流程图的好坏。他的说法把我彻底震了-这分工也太细了吧!也不知道该说他们那里这样是好还是不好。 ...
  • 软件测试工作基本流程

    千次阅读 多人点赞 2019-06-24 19:54:13
    最近在为面试新工作做准备,所以想想整理一下软件测试的基本工作流程,大致梳理一遍,这样也便于自己在面试过程中可以沉着的面对面试官的测试工作如何进行的问题。 首先,作为测试人员需要学习并了解业务,分析需求...
  • 管理就是定制度走流程--读后感

    千次阅读 2018-04-23 20:09:34
    对于企业管理,个人有一点拙见,简单来说就是制度和流程,往深了说,就是文化和体制,制度和流程是类似于物质文明的建设,文化和体制类似于精神文明的建设,物质是基础,也是保证,所以企业管理的前期工作重点一定是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,286
精华内容 38,914
关键字:

对流程如何进行评价