📄 contourshape.java
字号:
nNmax++;
break;
}
}
}
}
for (int f1 = 0; f1 < n; f1++) {
int f0 = (f1 > 0) ? (f1 - 1) : (n - 1);
int f2 = (f1 < n - 1) ? (f1 + 1) : 0;
fxfy[f1].x = 0.25 * (dxdy[f0].x + 2.0 * dxdy[f1].x + dxdy[f2].x);
fxfy[f1].y = 0.25 * (dxdy[f0].y + 2.0 * dxdy[f1].y + dxdy[f2].y);
}
//memcpy(dxdy, fxfy, n*sizeof(Point2));
System.arraycopy(fxfy, 0, dxdy, 0, n);
if ((nNmin < oNmin) && (nNmax < oNmax) &&
(oNmin <= (CONTOURSHAPE_MAXCSS)) &&
(oNmax <= (CONTOURSHAPE_MAXCSS))) {
for (int m1 = 0; m1 < nNmin; m1++) {
int idx = 0;
double diff = 9999.9;
for (int k1 = 0; k1 < oNmin; k1++) {
double d = Math.abs(nMinima[m1] - oMinima[k1]);
if (d > 0.5) d = 1.0 - d;
if (d < diff) {
idx = k1;
diff = d;
}
}
oNmin--;
if (idx < oNmin)
//memmove(&oMinima[idx], &oMinima[idx+1], (oNmin-idx)*sizeof(double));
System.arraycopy(oMinima, (idx + 1), oMinima, idx, (oNmin - idx));
}
for (int m2 = 0; m2 < nNmax; m2++) {
int idx = 0;
double diff = 9999.9;
for (int k1 = 0; k1 < oNmax; k1++) {
double d = Math.abs(nMaxima[m2] - oMaxima[k1]);
if (d > 0.5) d = 1.0 - d;
if (d < diff) {
idx = k1;
diff = d;
}
}
oNmax--;
if (idx < oNmax) {
//memmove(&oMaxima[idx], &oMaxima[idx+1], (oNmax-idx)*sizeof(double));
System.arraycopy(oMaxima, (idx + 1), oMaxima, idx, (oNmax - idx));
}
}
while (oNmin == 0) {
int idx = 0;
double diff = 9999.9;
for (int m3 = 0; m3 < oNmax; m3++) {
double d = Math.abs(oMaxima[m3] - oMinima[0]);
if (d > 0.5) d = 1.0 - d;
if (d < diff) {
idx = m3;
diff = d;
}
}
double x = 0.5 * (oMinima[0] + oMaxima[idx]);
if (Math.abs(oMinima[0] - oMaxima[idx]) > 0.5) {
if (x > 0.5)
x -= 0.5;
else
x += 0.5;
}
int xidx = 0;
diff = Math.abs(ang[0].x - x);
if (diff > 0.5) diff = 1.0 - diff;
for (int l1 = 1; l1 < n; l1++) {
double d = Math.abs(ang[l1].x - x);
if (d > 0.5) d = 1.0 - d;
if (d < diff) {
diff = d;
xidx = l1;
}
}
//memmove(&peaks[1], &peaks[0], (CONTOURSHAPE_MAXCSS-1)*sizeof(peaks[0]));
System.arraycopy(peaks, 0, peaks, 1, (CONTOURSHAPE_MAXCSS - 1));
peaks[0].x = (double) xidx;
peaks[0].y = rec;
if (nPeaks < CONTOURSHAPE_MAXCSS)
nPeaks++;
if (--oNmin == 0) {
//memmove(&oMinima[0], &oMinima[1], oNmin*sizeof(oMinima[0]));
System.arraycopy(oMinima, 1, oMinima, 0, (oNmin));
}
if (--oNmax > idx) {
//memmove(&oMaxima[idx], &oMaxima[idx+1], (oNmax-idx)*sizeof(oMaxima[0]));
System.arraycopy(oMaxima, (idx + 1), oMaxima, idx, (oNmax - idx));
}
}
}
rec++;
} while ((rec < maxrec) && (nNmin > 0) && (nNmax > 0));
oMaxima = null;
oMinima = null;
nMaxima = null;
nMinima = null;
fxfy = null;
ang = null;
double xc = 0.0;
double yc = 0.0;
double len = 0;
for (int s1 = 0; s1 < n; s1++) {
len += Math.sqrt(dxdy[s1].x * dxdy[s1].x + dxdy[s1].y * dxdy[s1].y);
xc += dxdy[s1].x;
yc += dxdy[s1].y;
fshp[s1].x = xc;
fshp[s1].y = yc;
}
double nsmap = 1.0 / ((double) n * (double) n);
for (int p1 = 0; p1 < nPeaks; p1++) {
double pl = 0.0;
for (int p2 = 0; p2 < peaks[p1].x; p2++)
pl += Math.sqrt(dxdy[p2].x * dxdy[p2].x + dxdy[p2].y * dxdy[p2].y);
peaks[p1].x = pl / len;
peaks[p1].y = CONTOURSHAPE_TXA0 * Math.pow(peaks[p1].y * nsmap, CONTOURSHAPE_TXA1);
}
d2xd2y = null;
dxdy = null;
double offset = peaks[0].x;
for (int p2 = 0; p2 < nPeaks; p2++) {
peaks[p2].x -= offset;
if (peaks[p2].x < 0.0)
peaks[p2].x += 1.0;
}
if (peaks[0].y < CONTOURSHAPE_AP)
nPeaks = 0;
for (int p3 = 0; p3 < nPeaks; p3++) {
if (peaks[p3].y < CONTOURSHAPE_YP * peaks[0].y)
nPeaks = p3;
}
setNoOfPeaks(nPeaks);
if (nPeaks == 0) {
setHighestPeakY(0);
}
double py = 0;
for (int i = 0; i < nPeaks; i++) {
long qx = 0; //unsigned
long qy = 0;
qx = (int) ((int) ((CONTOURSHAPE_XMASK * peaks[i].x / CONTOURSHAPE_XMAX) + 0.5) & CONTOURSHAPE_XMASK);
if (i == 0) {
//unsigned
long qyl = (long) ((CONTOURSHAPE_YMASK * peaks[i].y / CONTOURSHAPE_YMAX) + 0.5);
if (qyl > CONTOURSHAPE_YMASK)
qy = CONTOURSHAPE_YMASK;
else
qy = (int) (qyl & CONTOURSHAPE_YMASK);
py = (qy * CONTOURSHAPE_YMAX / (double) CONTOURSHAPE_YMASK);
} else {
//unsigned
long qyl = (long) ((CONTOURSHAPE_YnMASK * peaks[i].y / py) + 0.5);
if (qyl > CONTOURSHAPE_YnMASK)
qy = CONTOURSHAPE_YnMASK;
else
qy = (int) (qyl & CONTOURSHAPE_YnMASK);
py = (qy * py / (double) CONTOURSHAPE_YnMASK);
}
setPeak(i, qx, qy);
if (i == 0) {
setHighestPeakY(qy);
}
}
//unsigned
long[] qce = new long[2];//qe, qc;
qce = extractCurvature(n, ishp);//, qc, qe);
setGlobalCurvature(qce[0], qce[1]);
if (nPeaks > 0) {
qce = extractCurvature(n, fshp); //, qce[0], qce[1]);
setPrototypeCurvature(qce[0], qce[1]);
}
peaks = null;
fshp = null;
return nPeaks;
}
private long[] extractCurvature(int n, Point2D.Double[] shp) {
long[] returnValue = new long[2]; // long qc, long qe
long qc;
long qe;
double ecc = 0.0, cir = 0.0;
//IndexCoords *ind = new IndexCoords[n];
IndexCoords[] ind = new IndexCoords[n];
initIndexCoords(ind);
double x1 = shp[0].x, x2 = shp[0].x;
for (int k0 = 0; k0 < n; k0++) {
if (shp[k0].x < x1) x1 = shp[k0].x;
if (shp[k0].x > x2) x2 = shp[k0].x;
ind[k0].i = k0;
ind[k0].x = shp[k0].x;
ind[k0].y = shp[k0].y;
}
//qsort(ind, n, sizeof(ind[0]), compare_ind);
java.util.Arrays.sort(ind, new SortInd());
double y1 = ind[0].y, y2 = ind[n - 1].y;
int iw = (int) (x2 - x1 + 1);
int ih = (int) (y2 - y1 + 1);
int[] xy = new int[iw * ih];
//memset(xy, 0, iw*ih*sizeof(UChar));
int nedge = 0;
Edge[] edgelist = new Edge[n];
initEdgeArray(edgelist);
int ybot = (int) Math.ceil(y1 - 0.5);
int ytop = (int) Math.floor(y2 - 0.5);
if (ybot - (int) y1 < 0) ybot = (int) y1;
if (ytop - (int) y1 >= ih) ytop = ih - 1 + (int) y1;
int k1 = 0;
for (int y = ybot; y <= ytop; y++) {
for (; (k1 < n) && (ind[k1].y < (y + 0.5)); k1++) {
int i1 = ind[k1].i;
int i0 = (i1 < n - 1) ? i1 + 1 : 0;
int i2 = (i1 > 0) ? i1 - 1 : n - 1;
if (shp[i0].y <= y - 0.5) {
int e;
for (e = 0; (e < nedge) && (edgelist[e].i != i1); e++) ;
if (e < nedge) {
//memmove(&edgelist[e], &edgelist[e+1], (nedge-e)*sizeof(edgelist[0]));
System.arraycopy(edgelist, (e + 1), edgelist, e, (nedge - e));
nedge--;
}
} else if (shp[i0].y >= y + 0.5) {
edgelist[nedge].i = i1;
edgelist[nedge].dx = (shp[i1].x - shp[i0].x) / (shp[i1].y - shp[i0].y);
edgelist[nedge].x = edgelist[nedge].dx * (y - shp[i0].y) + shp[i0].x;
nedge++;
}
if (shp[i2].y <= y - 0.5) {
int e;
for (e = 0; (e < nedge) && (edgelist[e].i != i2); e++) ;
if (e < nedge) {
//memmove(&edgelist[e], &edgelist[e+1], (nedge-e)*sizeof(edgelist[0]));
System.arraycopy(edgelist, (e + 1), edgelist, e, (nedge - e));
nedge--;
}
} else if (shp[i2].y >= y + 0.5) {
edgelist[nedge].i = i2;
edgelist[nedge].dx = (shp[i1].x - shp[i2].x) / (shp[i1].y - shp[i2].y);
edgelist[nedge].x = edgelist[nedge].dx * (y - shp[i2].y) + shp[i2].x;
nedge++;
}
}
//qsort(edgelist, nedge, sizeof(edgelist[0]), compare_edges);
java.util.Arrays.sort(edgelist, new SortEdge());
for (int s = 0; s < nedge - 1; s += 2) {
int xl = (int) Math.ceil(edgelist[s].x) - (int) x1;
if (xl < 0) xl = 0;
int xr = (int) Math.floor(edgelist[s + 1].x) - (int) x1;
if (xr >= iw) xr = iw - 1;
int yl = (int) (y - (int) y1);
for (int f = xl; f <= xr; f++)
xy[f + yl * iw] = 255;
edgelist[s].x += edgelist[s].dx;
edgelist[s + 1].x += edgelist[s + 1].dx;
}
}
double perim = Math.sqrt((shp[0].x - shp[n - 1].x) * (shp[0].x - shp[n - 1].x) +
(shp[0].y - shp[n - 1].y) * (shp[0].y - shp[n - 1].y));
for (int p = 1; p < n; p++) {
perim += Math.sqrt((shp[p].x - shp[p - 1].x) * (shp[p].x - shp[p - 1].x) +
(shp[p].y - shp[p - 1].y) * (shp[p].y - shp[p - 1].y));
}
double vol = 0;
double meanx = 0.0;
double meany = 0.0;
for (int vy = 0; vy < ih; vy++) {
for (int vx = 0; vx < iw; vx++) {
if (xy[vx + vy * iw] == 0) {
meanx += vx;
meany += vy;
vol++;
}
}
}
meanx /= vol;
meany /= vol;
double i11 = 0.0, i20 = 0.0, i02 = 0.0;
// double rad = 0.0, co = 0.0;
for (int ey = 0; ey < ih; ey++) {
for (int ex = 0; ex < iw; ex++) {
if (xy[ex + ey * iw] == 0) {
i11 += (ex - meanx) * (ey - meany);
i20 += (ex - meanx) * (ex - meanx);
i02 += (ey - meany) * (ey - meany);
}
}
}
double temp1 = (i20 + i02);
double temp2 = Math.sqrt(i20 * i20 + i02 * i02 - 2.0 * i02 * i20 + 4.0 * i11 * i11);
cir = perim * perim / vol;
ecc = Math.sqrt((temp1 + temp2) / (temp1 - temp2));
ind = null;
edgelist = null;
xy = null;
if (ecc >= CONTOURSHAPE_EMAX)
qe = CONTOURSHAPE_EMASK;
else if (ecc < CONTOURSHAPE_EMIN)
qe = 0;
else
qe = (long) ((long) (((CONTOURSHAPE_EMASK + 1) * (ecc - CONTOURSHAPE_EMIN)
/ (CONTOURSHAPE_EMAX - CONTOURSHAPE_EMIN))) & CONTOURSHAPE_EMASK);
if (cir >= CONTOURSHAPE_CMAX)
qc = CONTOURSHAPE_CMASK;
else if (cir < CONTOURSHAPE_CMIN)
qc = 0;
else
qc = (long) (((long) ((CONTOURSHAPE_CMASK + 1) * (cir - CONTOURSHAPE_CMIN)
/ (CONTOURSHAPE_CMAX - CONTOURSHAPE_CMIN))) & CONTOURSHAPE_CMASK);
returnValue[0] = qc;
returnValue[1] = qe;
return returnValue;
}
private static void debug(String message) {
if (debug) System.out.println("[ColorLayout] " + message);
}
/*
EXAMPLE:
========
<VisualDescriptor xsi:type="ColorLayoutType">
<YDCCoeff>12</YDCCoeff>
<CbDCCoeff>2</CbDCCoeff>
<CrDCCoeff>2</CrDCCoeff>
<YACCoeff5>1 1 1 1 1</YACCoeff5>
<CbACCoeff2>2 2</CbACCoeff2>
<CrACCoeff2>2 2</CrACCoeff2>
</VisualDescriptor>
*/
public static void main(String[] args) {
try {
List pointListStar3 = new Vector();
pointListStar3.add(new Point2D.Double(290, 439));
pointListStar3.add(new Point2D.Double(312, 308));
pointListStar3.add(new Point2D.Double(425, 238));
pointListStar3.add(new Point2D.Double(300, 285));
pointListStar3.add(new Point2D.Double(183, 222));
pointListStar3.add(new Point2D.Double(286, 306));
//console.line();
//console.echo(CollectionTools.printCollectionContent(pointListStar3));
pointListStar3 = java2dTools.normalizeCoordinate(pointListStar3);
//console.line();
//console.echo(CollectionTools.printCollectionContent(pointListStar3));
ContourShape cl = new ContourShape(pointListStar3);
Element desc1 = cl.getDescriptor();
//console.line();
//todo: check this, jdom changed
//new XMLOutputter(" ", true).output(desc1, System.out);
//new XMLOutputter().output(desc1, System.out);
//console.echo("");
List pointListBox = new Vector();
pointListStar3.add(new Point2D.Double(30, 30));
pointListStar3.add(new Point2D.Double(200, 30));
pointListStar3.add(new Point2D.Double(200, 100));
pointListStar3.add(new Point2D.Double(30, 100));
ContourShape c2 = new ContourShape(pointListStar3);
Element desc2 = cl.getDescriptor();
//console.line();
//todo: check this, jdom changed
//new XMLOutputter(" ", true).output(desc1, System.out);
//new XMLOutputter().output(desc1, System.out);
//console.echo("");
//console.line();
//Element desc2 = new ContourShape(64, 64, ImageIO.read(new FileInputStream("test2.jpg"))).getDescriptor();
//Element desc3 = new ContourShape(64, 64, ImageIO.read(new FileInputStream("test3.jpg"))).getDescriptor();
//System.out.println("Similarity test1 test2: " + ContourShape.getSimilarity(desc1, desc2));
//System.out.println("Similarity test1 test3: " + ContourShape.getSimilarity(desc1, desc3));
//System.out.println("Similarity test2 test3: " + ContourShape.getSimilarity(desc2, desc3));
} catch (Exception e) {
e.printStackTrace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -