图像特征点检测与匹配评价准则——量化
欢迎转载,转载请注明出处,谢谢!
目前图像匹配中,局部特征匹配占据了绝大部分,常用的局部特征匹配方法有Harris、SIFT、SURF、ORB等等,不同的特征点检测和匹配方法尤其独特的优势和不足;
特征点匹配经过Ransac算法优化后仍存在错误匹配点对,需要优化后的匹配结果进行量化评价;
特征点检测和匹配评价一般包括两个部分,分别为检测和匹配的评价。
1、特征点检测评价
评价特征点检测方法的优劣常常用到repeatability(重复率)这个概念。
《a performance evaluation of local descriptors》一文提出了特征点检测器和匹配结果的评价准则,我的理解是:图A、B是两幅待匹配图像,图A映射到图B有一个单应性矩阵H1,图B映射到图A有单应性矩阵H2,图A检测出N1个特征点,图B检测出N2个特征点,因为图像A和B有部分图像不重叠,故将A图检测的特征点坐标由H1算出在B图的坐标,去掉不合格(计算结果超出在B图像坐标)的特征点,剩下的特征点数记为n1;同样,B图的特征点经过处理剩下n2个;分母便是min(n1, n2)。将图A剩下的特征点由H1计算出在图B中的坐标,与图B检测出的特征点的坐标求距离,即dist(h1*a1, b1),若距离小于阈值ε,则认为是重复的,这么做是因为得到的单应性矩阵不一定完全精确以及一些别的误差原因。
《An affine invariant interest point detector》中对repeatability定义进行了延伸,针对affine invariant的图像特征点。
repeatability计算式的分母可以和原来定义相同,分子的定义correspondence满足两个条件:
1、同之前定义,即设定ε=1.5;
2、regions映射到另一幅图像中重叠误差小于0.2。
这里第二点是因为特征点检测器得到的特征点实际上是根据特征点附近区域计算梯度来选取特征点,实际上检测的特征区域(region),如Harris-Affine检测的是一个椭圆区域,SIFT检测的是一个圆形区域;当左图一特征点区域在经过乘上单应性矩阵H后实际,该区域会发生变化,所以需要判断变化之后的区域与右图某一特征点区域的重叠误差,误差<0.2,则判断自是一对特征点。
2、特征点匹配评价
特征点匹配的评价一般涉及到两个概念,即Recall(召回率)和Precision(精确率),我们先来了解一下这两个概念。
精确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。
——精确率是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;
——召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。
在信息检索中:
- 精确率 = 提取出的正确信息条数 / 提取出的信息条数
- 召回率 = 提取出的正确信息条数 / 样本中的信息条数
下面是一个非常经典的解释Recall和Precision的图,我做了一点儿说明:
Precision和Recall指标有时候会出现的矛盾的情况,可以绘制Precision-Recall曲线,曲线越靠上部,结果越好。
对比信息检索的评价,在特征点匹配时:
A指的是实际为匹配点对,且该匹配算法得到了这些匹配对;
B指的是实际为匹配点对,但该匹配算法没有得到这些匹配对;
C指的是实际为错误匹配对,但该算法得到了这些匹配对;
即Precision为匹配结果中有多少是准确的,Recall就是所有正确的匹配结果有多少通过匹配算法得到了。
在第一部分中已经说明了根据两图像间的单应性矩阵H计算两个特征点是否重复,这里设置一个correspondence变量,作为重复特征点的数量,则匹配结果评价的两个参数Precision和Recall有如下公式:
公式中,#correct matches表示匹配结果中正确匹配点对,#correspondences表示特征点检测时重复特征点对(特征点重复即认为实际为正确匹配点对,但可能被匹配算法匹配上,也可能未匹配上),#false matches表示匹配结果中错误匹配点对。其中,正确与错误匹配点对可以用上面提到的两个判断特征点是否重复的条件来判定。
因此,在评价特征点匹配结果时,首先应当知道两个图像间的单应性矩阵H,然后通过特征点检测算法得到左右图像中的特征点信息,根据单应性矩阵得到重复特征点数,即#correspondences;接着由特征点匹配算法得到的匹配结果计算Precision和Recall,绘制1-precision和recall曲线,曲线靠上方的结果较出色!
参考曲线图:
(图片来源——《A Performance Evaluation of Local Descriptors》)
以上内容为我的理解,可能存在理解不当的地方,欢迎指正!
转载请注明出处:图像特征点检测与匹配评价准则——量化
参考资料:
介绍Precision和Recall的博客:
http://blog.csdn.net/pirage/article/details/9851339
http://bookshadow.com/weblog/2014/06/10/precision-recall-f-measure/
文章《A Performance Evaluation of Local Descriptors》
https://www.robots.ox.ac.uk/~vgg/research/affine/det_eval_files/mikolajczyk_pami2004.pdf
K Mikolajczyk大神的特征点重复率计算相关代码:
http://www.robots.ox.ac.uk/~vgg/research/affine/descriptors.html#binaries
特征点检测匹配标准数据库:
http://www.robots.ox.ac.uk/~vgg/data/data-aff.html
研究特征提取的方法,找到提取出来的特征精度最高,这里的最高是指在多帧运动变化图片里应用此算法都能找到固定位置的特征,而且这个特征不限,可以是边缘、角点或区域块等,然后根据不同特征、其运动变化及图像成像质量提供不同的算法,以达到最优。这个方向刚开始的确十分头大,完全不知道从什么着手,是边缘提取算法呢?还是先作目标分割,大概想一两天,决定先从特征点(包括角点)提取算法做起,先找到在特征点算法里非常优秀的,然后结合各种背景(噪声,运动变化)测试其变化。
这里主要的思路来自于一个仿射不变特征提取方法的检测:http://www.robots.ox.ac.uk/~vgg/research/affine/
这个网站上面主要提供了一个仿射不变特征提取方法的评估,它提供了八组图片,分别从噪声、模糊、视点变化、缩放、旋转、亮度变化来评估其仿射不变特征提取方法的效果。不过它主要是对相似区域进行提取,涉及到椭圆区域的仿射变换,而我主要进行点特征点提取的评估,要稍微简单点,当然也借鉴了其代码(这里面只有评估代码,没有特征提取算法的代码,不过提供了一系列算法的执行文件)
我首先要测试的sift算法对视点变化的评估,从上面的网站里下载了几个图片【img1.ppm、img2.ppm】、变化矩阵【H1to2p】及特征点提取文件【img1.haraff.sift】,我主要从特征向量匹配程度和实际匹配的位置进行比较。我的代码如下:
- function [matchFeaIndex, matchFeaRatio,matchLocal1]=matchPointFea(file1,file2,H,image1,image2)
- % 主要用特征点匹配效果测试:
- % 用法:[matchFeaIndex, matchFeaRatio,matchLocal1]=matchPointFea('img1.haraff.sift','img2.haraff.sift','H1to2p','img1.ppm','img2.ppm');
- % 输入:
- % file1 - 图像1特征点检测文件
- % file2 - 图像2特征点检测文件
- % H - 图像1到图像2的仿射变换矩阵
- % image1 - 图像1
- % image2 - 图像2
- % 输出:
- % matchFeaIndex - 保存图像1中同图像2匹配的特征点在file2中的标号,若不匹配则为0。
- % matchFeaRatio - 对应于matchIndex,保存特征点匹配程度,不匹配则为0。
- % matchLocal1 - 保存图像2中特征点位置同经过仿射变换1之间的位置差别
- % matchLocal2 - 保存图像1中特征点位置同经过仿射变换2之间的位置差别(保留)
- % 特征点检测文件格式:
- % file1, file2:
- % x1 y1 a1 b1 c1 c2 c3 ...
- % x2 y2 a2 b2 c1 c2 c3 ...
- %---------------------
- % 第一行 保存描述子数目及大小
- % x, y - 特征点位置
- % a, b - 特征点大小及方向(主要针对于sift变换)
- % d1 d2 d3 ... - 特征描述子向量(如果小于,则无效)
- close all;
- % loc存放位置及大小角度,des存放特征描述子向量,dimdesc存放描述子大小及数目
- [des1, loc1, dimdesc1]=loadFeatures(file1);
- [des2, loc2, dimdesc2]=loadFeatures(file2);
- % 导入图像
- Im1=imread(image1);
- Im2=imread(image2);
- % 导入仿射矩阵文件
- H=load(H);
- fprintf(1,'numbers and length of descriptor in file1 %d %d\n',dimdesc1(1),dimdesc1(2));
- fprintf(1,'numbers and length of descriptor in file2 %d %d\n',dimdesc2(1),dimdesc2(2));
- if dimdesc1(2)>1 && dimdesc1(2)==dimdesc2(2)
- fprintf(1,'%s, %s look like files with descriptors...\n',file1,file2);
- else
- error('Different descriptor dimension in %s or %s files.',file1,file2);
- end
- % 计算两个特征向量的匹配程度可以通过向量空间余弦相似度来衡量.
- % 设置比值distRatio,保证所匹配的特征点具有显著相似度,即与第二相似度有较大差异.
- distRatio = 0.6;
- % 在图像2中找到图像1中每一个匹配点.
- des2t = des2'; % 转置
- desNum = dimdesc1(1); % 图像1特征点个数
- matchFeaIndex=zeros(desNum,1);
- matchFeaRatio=zeros(desNum,1);
- matchNum=0;
- for i = 1 : desNum
- dotprods = des1(i,:) * des2t; % 计算乘积项
- [vals,indx] = sort(acos(dotprods)); % 排序余弦相似度
- % 找到最大余弦相似度.
- if (vals(1) < distRatio * vals(2))
- matchFeaIndex(i) = indx(1);
- matchFeaRatio(i) = vals(1);
- matchNum=matchNum+1;
- else
- matchFeaIndex(i) = 0;
- end
- end
- fprintf(1,'numbers of match descriptor is %d \n',matchNum);
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 确定图像1中特征点变换到图像2中的位置,及图像2变换到图像1中的位置
- % 要进行仿射变换测试,要求图像1和2必须大小相同
- if size(Im1)==size(Im2)
- HI=H(:, 1:3); %图1到图2
- H=inv(HI); %图2到图1
- fprintf(1,'Projecting 1 to 2...\n');
- loc1t=projectPoints(loc1',HI);
- loc1t=loc1t';
- fprintf(1,'and 2 to 1...\n');
- loc2t=projectPoints(loc2',H);
- loc2t=loc2t';
- ImageSize=size(Im1);
- matchLocal1=matchLocal(loc1t,loc2,ImageSize,matchFeaIndex);
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 画图
- % showkeys(image1,loc1); % 特征点显示
- % showkeys(image2,loc2);
- % 显示匹配图像过程
- Im=appendimages(Im1,Im2);
- % Show a figure with lines joining the accepted matches.
- figure('Position', [0 0 size(Im,2) size(Im,1)]);
- colormap('gray');
- imagesc(Im);
- hold on;
- cols1 = size(Im1,2);
- for i = 1: size(des1,1)
- if (matchFeaIndex(i) > 0 && matchLocal1(i)<5)
- line([loc1(i,1) loc2(matchFeaIndex(i),1)+cols1], ...
- [loc1(i,2) loc2(matchFeaIndex(i),2)], 'Color', 'c'); %画对应线条
- plot(loc1(i,1),loc1(i,2),'r.'); %画特征点
- plot(loc2(matchFeaIndex(i),1)+cols1,loc2(matchFeaIndex(i),2),'g.'); %画特征点
- end
- end
- hold off;
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 点的投影运算
- function loct=projectPoints(loc,H)
- num=size(loc(1)); %特征点数目
- loct=loc;
- for i=1:num
- l1=[loc(i,1),loc(i,2),1];
- l1_2=H*l1';
- l1_2=l1_2/l1_2(3);
- loct(i,1)=l1_2(1);
- loct(i,2)=l1_2(2);
- end
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 加载描述子文件
- function [des, loc, dimdes]=loadFeatures(file)
- fid = fopen(file, 'r');
- [dimdes, count]=fscanf(fid, '%d %d',[1 2]);
- if count ~= 2
- error('Invalid keypoint file beginning.');
- end
- num = dimdes(1); %描述子数目
- len = dimdes(2); %描述子长度
- loc = double(zeros(num, 4));
- des = double(zeros(num, len));
- % 将描述子导入向量
- for i = 1:num
- [vector, count] = fscanf(fid, '%f %f %f %f', [1 len+5]); %row col scale ori
- if count ~= (5+len)
- error('Invalid keypoint file format');
- end
- loc(i, :) = vector(1, 1:4);
- descrip(1, :) = vector(1, 6:len+5);
- descrip = descrip / sqrt(sum(descrip.^2));
- des(i, :) = descrip(1, :);
- end
- fclose(fid);
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 计算实际特征匹配的偏差位置
- function matchLoc=matchLocal(loct,loc,ImageSize,matchFeaIndex)
- matchLoc=ones(size(matchFeaIndex));
- for i=1:size(loct)
- if matchFeaIndex(i)~=0 %找到匹配的点
- %注意仿射变换,位置可能超过图像范围
- if loct(i,1)>0&&loct(i,1)<ImageSize(1)&&loct(i,2)>0&&loct(i,2)<ImageSize(2)...
- &&loc(matchFeaIndex(i),1)>0&&loc(matchFeaIndex(i),1)<ImageSize(1)&&loc(matchFeaIndex(i),2)>0&&loc(matchFeaIndex(i),2)<ImageSize(2)
- matchLoc(i)=(loct(i,1)-loc(matchFeaIndex(i),1))^2+(loct(i,2)-loc(matchFeaIndex(i),2))^2;
- matchLoc(i)=sqrt(matchLoc(i)); %这个偏差即是欧氏距离
- end
- end
- end
- matchLoc=100.*matchLoc./max(matchLoc); %计算百分比
- end
相关文章:

path,classpath
1.path作用. 在环境变量里面配置 winr 打开cmd qq窗口就弹开了。 2.classpath是java里的选项。 java执行java类的时候,会去看这个java类是否在classpath路径下。不在就不能编译转载于:https://www.cnblogs.com/shapeOfMyHeart/p/5975686.html

【Codeforces】401C Team (01010110...)
http://codeforces.com/contest/401/problem/C 题目中,n表示0的个数,m表示1的个数,要求两个0不能连续,三个1不能连续 还要判断能否输出满足要求的序列,不满足输出-1 满足条件以后徐瑶分情况讨论 当1比0多ÿ…

表白这件事,比解 bug 要难多少?
情人节快乐!我是可爱无敌的阿里妹。 今天是个粉红色日子,我们来聊聊和技术无关的“技术活”,比如: “如何表白?” 当技术人碰上动心的姑娘,他的浪漫开关就打开了。 在代码王国里劈荆斩刺的王子,…

特征点匹配+特征检测方法汇总
特征点匹配特征检测方法汇总特征提取与匹配---SURF;SIFT;ORB;FAST;Harris角点匹配方法匹配函数1. OpenCV提供了两种Matching方式:• Brute-force matcher (cv::BFMatcher) //暴力方法找到点集1中每个descriptor在点…
元数据驱动的微服务架构(上)
本次分享有两个部分: 微服务架构需要元数据 介绍微服务与元数据的关系。 一、微服务架构需要元数据 企业IT架构已经发展了多个阶段,一方面是服务化架构的发展,在SOA阶段主要解决应用间集成问题,但随着企业业务的发展,…

【Codeforces】427B Prison Transfer(别让罪犯跑了...)
http://codeforces.com/problemset/problem/427/B 从一串数字中选出连续的长度为c的子串,且子串中的每一个数都不能大于t,问这样的子串有多少个 TLE,看看n的范围就知道了,哎呀呀,有点chun #include <iostream>…

PHPUnit实践三(构建模块化的测试单元)
本系列教程所有的PHPUnit测试基于PHPUnit6.5.9版本,Lumen 5.5框架 目录结构 模块下的目录是符合Lumen的模块结构的如:Controllers、Models、Logics等是Lumen模块目录下的结构目录如果有自己的目录同级分配即可,如我这里的Requests 整体结构 ├…
SLAM笔记(五)光束平差法(Bundle Adjustment)
1.什么是光束平差法 前边的八点法,五点法等可以求出闭式解的前提是已经知道确切的点对。但实际情况中往往存在大量的噪声,点与点不是精确地对应甚至出现一些错误匹配。 光束平差法由Bundle Adjustment翻译得来,有两层意思: 对场…

【Code forces】63B Settlers' Training
http://codeforces.com/problemset/problem/63/B 给你一串数字,直到所有数字都变为k为止,相同的数为一组,在一次中,所有不同的数都加1 1 2 2 3 → 2 2 3 4 → 2 3 4 4 → 3 4 4 4 → 4 4 4 4 #include <ios…

[elixir! #0007] [译] 理解Elixir中的宏——part.5 重塑AST by Saša Jurić
上一章我们提出了一个基本版的deftraceable宏,能让我们编写可跟踪的函数。宏的最终版本有一些剩余的问题,今天我们将解决其中的一个——参数模式匹配。 今天的练习表明我们必须仔细考虑宏可能接收到的输入。 问题 正如我上一次暗示的那样,当前…
vue-cli3环境变量与分环境打包
第一步 : 了解环境变量概念 我们可以根目录中的下列文件来指定环境变量: .env # 在所有的环境中被载入 .env.local # 在所有的环境中被载入,但会被 git 忽略 .env.[mode] # 只在指定的模式中被载入 .env.[mode].local # 只在指定…
SLAM闭合回环————视觉词典BOW小结
在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只通过bag of words 模型用在图像处理中进行形象讲解,并没有涉及太多对SLAM的闭环检测…

【Codeforces】53D Physical Education (有点像冒泡)
http://codeforces.com/problemset/problem/53/D 从上面所给的序列变成下面所给的序列 交换的时候只能交换相邻的两个数字 输出每一步的交换方法,输出的是该元素在序列中的位置(第一个数的位置是1) 不要求输出步数最少的那一种方法 当同…

js脚本冷知识
js中有个很恶心的写法。比如这个var adsf(function(){})();这样的写法,主要是原生的,能在dom元素加载完之后实现自动加载这个脚本文件到里面去。可以验证这个(function(){.......)();在.......里面可以直接…

Python中is同一性运算符和==相等运算符区别
2019独角兽企业重金招聘Python工程师标准>>> 在区分is和这两种运算符区别之前,需要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。 比较对象的value(值) 是python标准操作符中的比较操作符…
C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)
排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序: 直接插入排序 希尔排序 (插入) 冒泡排序 快速排序 (交换) 直接选择排序 堆排序(选择&#…

32位处理器是什么意思
问题描述:朋友那个32位处理器,2的32次方算出来的单位是不是应该是4294967296位(bit)吧,怎么就成字节了呢?单位错了,那个32位是指32位地址总线,而不是32位数据。地址的数量单位是个&a…
【Codeforces】913C Party Lemonade (贪...)。
http://codeforces.com/contest/913/problem/C 这个题和以前见过的有点不一样,可以重复选择,这个有点emmm 首先将a数组优化,举个例子,如果1L20元,2L50元,那么将a[1]赋值为40,而不是50。 之后…
GDB 调试 Mysql 实战(二)GDB 调试打印
背景 在 https://mengkang.net/1328.html 实验中,我们通过optimizer_trace发现group by会使用intermediate_tmp_table,而且里面的的row_length是20,抱着"打破砂锅问到底"的求学精神,所以想通过 gdb 调试源码的方式看这个…

移动端AR的适用分析(二)
移动端AR的适用分析(二)1. 单目SLAM难点 2. 视觉SLAM难点 3. 可能的解决思路 单目slam的障碍来自于理论和实践两个方面。理论障碍可以看做是固有的,无法通过硬件选型或软件算法来解决的,例如单目初始化和尺度问题。实践问题包括计…

新的理念、 新的解决方案、 新的Azure Stack技术预览
Jeffrey Snover 我们很高兴地宣布︰ Azure Stack Technical Preview 2(TP2)已发布!我们朝着向您的数据中心提供Azure服务能力的目标又更近一步。自发布第一个技术预览版(TP1)以来,我们访问了很多用户&…

【HDU】1084 What Is Your Grade? (结构体 sort)
http://acm.hdu.edu.cn/showproblem.php?pid1084 题目的关键: 1、Note, only 1 student will get the score 95 when 3 students have solved 4 problems. If you can solve 4 problems, you can also get a high score 95 or 90 (you can get the former(前者)…

FastDFS之Linux下搭建
1.软件环境 CentOS6.5 FastDFS v5.05 libfastcommon- - master.zip(是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库) fastdfs- - nginx- - module_v1.16.tar.gz nginx- - 1.6.2.tar.gz fastdfs_client_java._v1.25.tar.gz 2.FastDFS集群规划 描述 …
Linux进程与线程的区别 详细总结(面试经验总结)
首先,简要了解一下进程和线程。对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务。系统的管理架构也是基于进程层面的。在按下电源键之后,计算机就开始了复杂的启动过程…

【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)
http://poj.org/problem?id1411 POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode1689 ZOJ http://acm.hdu.edu.cn/showproblem.php?pid1239 HDU 都是同一个题,但是可能你在HDU上AC,在POJ和ZOJ上是TLE(所以还有待…

[AVR]使用AVR单片机驱动舵机
最近参加了三系举办的小车比赛(好像叫什么"驭远杯")。领导要求我驱动3-4个舵机。研究了几日,总算折腾出一个方案..、 1.舵机驱动的基本原理 (可以参考http://blog.sina.com.cn/s/blog_8240cbef01018hu1.html) "控制信号由接收…

高阶函数的使用
问题 字节跳动面试时问题:原函数例如fetchData是一个异步函数,尝试从服务器端获取一些信息并返回一个Promise。写一个新的函数可以自动重试一定次数,并且在使用上和原函数没有区别。 思路 这个问题其实不是很难,不过可能是太菜了紧…

内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)
一、定义(概念与区别) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请 了一个integer,但给它存了long才能存下的数,那就是内存溢出。 …

【Codeforces】716B Complete the Word (26个字母)
http://codeforces.com/contest/716/problem/B 给你一个字符串该字符串中是否存在长度为26且这26个字母没有重复 一个满足上述条件但是部分区域是问号的话,需要用剩下的字母覆盖掉问号,其余部分的问号可以随便赋值 没有的话输出-1 暴力即可。 #incl…

MySQL ERROR 1878 解决办法
MySQL ERROR 1878报错解决办法错误重现Part1:大表修改字段mysql> ALTER TABLE erp-> ADD COLUMN eas_status tinyint(3) unsigned NOT NULL DEFAULT 0 AFTER totalprice;ERROR 1878 (HY000): Temporary file write failure.mysql> \q这里可以看到,添加字…