⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contourshape.java

📁 基于MPEG 7 标准,符合未来语义网架构,很值得参考
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                            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 + -