#include "measurepos.h" using namespace MeasurePos; Messure::Messure(float Row, float Column, double Phi, int Length1, int Length2, int Width, int Height, string Interpolation) {
this->Row = Row; this->Column = Column; this->Phi = Phi; this->Length1 = Length1; this->Length2 = Length2; this->Width = Width; this->Height = Height; this->Interpolation = Interpolation;
}
Messure::~Messure() { }
int Messure::measure_pos(Mat &Image, int &MeasureHandle, double Sigma, double Threshold, string Transition, string Select, vector
else if (Interpolation == Bilinear) { Roiimage.at
(i, j) = (uchar)BilinearInter(Image, retPoint.x, retPoint.y); } else if (Interpolation == Bicubic) { } else return -1; } } //统计均值 vector
meangray; meangray.clear(); for (int j = Column - Length1; j < Column + Length1; j++) { int gray = 0; float meanvalue = 0; for (int i = Row - Length2; i < Row + Length2; i++) { gray += Roiimage.at
(i, j); } meanvalue = gray / (2 * Length2); meangray.push_back(meanvalue); } //显示点集 Mat meanimage; meanimage.create(Height, Width, CV_8UC3); int sizemean = meangray.size(); //高斯滤波 float f1, f0, f2; f0 = 1.0 / (sqrtf(2 * CV_PI)*Sigma); f1 = f0*exp(-1.0 / (Sigma*Sigma)); f2 = f1; float sumoff; sumoff = f0 + f1 + f2; vector
gaussvalue; gaussvalue.push_back(meangray[0]); for (int i = 1; i < sizemean-1;i++) { float tmp; tmp = meangray[i - 1] * f1 + meangray[i] * f0 + meangray[i + 1] * f2; tmp = tmp / sumoff; gaussvalue.push_back(tmp); } gaussvalue.push_back(meangray[sizemean-1]); //求导 for (int i = 1; i < sizemean - 1;i++) { meangray[i] = (gaussvalue[i + 1] - gaussvalue[i-1])/2*(sqrtf(2 * CV_PI)*Sigma); } meangray[sizemean - 1] = 0; //阈值分割 vector
threholdvalue; threholdvalue.clear(); for (int i = 0; i < sizemean; i++) else threholdvalue.push_back(0); } //求倒数最大值 for (int i= 1; i < sizemean-1; i++) , { 160 * 160, 160, 1 }, { 390 * 390, 390, 1 } }; A[0][0] = (i - 1)*(i - 1); A[0][1] = (i - 1); A[1][0] = i*i; A[1][1] = i; A[2][0] = (i + 1)*(i + 1); A[2][1] = (i + 1); float B[3] = { 420, 90, 410 }; B[0] = threholdvalue[i - 1]; B[1] = threholdvalue[i]; B[2] = threholdvalue[i + 1]; float C[3] = { 0, 0, 0 }; CvMat* matA = cvCreateMat(3, 3, CV_32FC1); CvMat* matB = cvCreateMat(3, 1, CV_32FC1); CvMat* matC = cvCreateMat(3, 1, CV_32FC1); cvSetData(matA, A, CV_AUTOSTEP); cvSetData(matB, B, CV_AUTOSTEP); cvSolve(matA, matB, matC, CV_LU); /*for (int j = 0; j < 3; j++){ printf("%f ", matC->data.fl[j]); }*/ // tmppoint.x = -matC->data.fl[1] / (2 * matC->data.fl[0]); Amplitude.push_back(matC->data.fl[0] * tmppoint.x*tmppoint.x + matC->data.fl[1] * tmppoint.x + matC->data.fl[2]); tmppoint.x = tmppoint.x - Length1; tmppoint.y = 0; outpoint = RoratePoint(tmppoint, Phi); outpoint.x += Column; outpoint.y += Row; RowEdge.push_back(outpoint.y); ColumnEdge.push_back(outpoint.x); //cout << " tmppoint.x= " << outpoint.x << " tmppoint.y= " << outpoint.y << endl; } } } int edgesize = RowEdge.size(); for (int i = 1; i < edgesize; i++) { Distance.push_back(sqrtf((RowEdge[i] - RowEdge[i - 1])*(RowEdge[i] - RowEdge[i - 1]) + (ColumnEdge[i] - ColumnEdge[i - 1])*(ColumnEdge[i] - ColumnEdge[i - 1]))); } return 1;
}
Point2ff Messure::RoratePoint(Point2ff SrcPoint, double Phi) {
Point2ff TmpPoint; TmpPoint.x = float(cos(Phi)*SrcPoint.x - sin(-Phi)*SrcPoint.y); TmpPoint.y = float(sin(-Phi)*SrcPoint.x + cos(Phi)*SrcPoint.y); return TmpPoint;
} //最近邻域插值 int Messure::Nearest_neighborInter(Mat &Image, float x, float y)
//双线性插值 int Messure::BilinearInter(Mat &Image, float x, float y)
else else { // 在图像右边缘上且不是最后一点,直接一次插值即可 f1 = Image.at
(y1, x1); f3 = Image.at
(y1, x2); // 返回插值结果 return ((int)(f1 + (y - y1) * (f3 - f1))); } } else if (fabs(y - nHeight + 1) <= epsilon) { // 要计算的点在图像下边缘上且不是最后一点,直接一次插值即可 f1 = Image.at
(y1, x1); f2 = Image.at
(y2, x1); // 返回插值结果 return ((int)(f1 + (x - x1) * (f2 - f1))); } else { // 计算四个最临近象素值 f1 = Image.at
(y1, x1); f2 = Image.at
(y2, x1); f3 = Image.at
(y1, x2); f4 = Image.at
(y2, x2); // 插值1 f12 = (unsigned char)(f1 + (x - x1) * (f2 - f1)); // 插值2 f34 = (unsigned char)(f3 + (x - x1) * (f4 - f3)); // 插值3 return ((int)(f12 + (y - y1) * (f34 - f12))); } }
}
bool Messure::Matrix_PolyFit(double *x, double *y, int X_Y_Number, int Fit_N, double *ks)
int i, j, index, n; double temp, *x2, *y2; Fit_N++; y2 = new double[Fit_N]; x2 = new double[Fit_N*Fit_N]; for (i = 0, index = 0; i
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/255231.html