示例#1
0
void GridDialog::item_click()
{
    QString item_id = QObject::sender()->objectName();
    QChar kind = item_id.at(0);
    int idx = item_id.mid(1).toInt();
    if (kind == 'm') {
        describe_monster(mon_list[idx].r_idx, false, "");
    }
    else if (kind == 'o') {
        object_info_screen(o_list + idx);
    }
    else {
        describe_feature(idx, false);
    }
}
示例#2
0
文件: harris.cpp 项目: cherip/Harris
IplImage *harris(IplImage *img, float threshold, float ***ptsDes, int *npts, int *ndes, t_point **_pts) {
    IplImage *src = get_gray(img);
    IplImage *deriX = derivateX(src);
    IplImage *deriY = derivateY(src);
    IplImage *deriXY = cvCloneImage(deriX);
    //
    cvMul(deriX, deriY, deriXY);
    cvMul(deriX, deriX, deriX);
    cvMul(deriY, deriY, deriY);

//  cvNamedWindow("1", CV_WINDOW_AUTOSIZE);
//  cvShowImage("1", deriX);
//  cvWaitKey(0);

    cvSmooth(deriX, deriX, CV_GAUSSIAN, 5);
    cvSmooth(deriY, deriY, CV_GAUSSIAN, 5);
    cvSmooth(deriXY, deriXY, CV_GAUSSIAN, 5);

//  cvNamedWindow("1", CV_WINDOW_AUTOSIZE);
//  cvShowImage("1", deriX);
//  cvWaitKey(0);

    IplImage *printImg = cvCloneImage(img);

    int w = src->width;
    int h = src->height;
    float *cims = new float[w * h];
    float *vals = new float[w * h];
    float k = 0.06;
    memset(vals, 0, sizeof(vals));
//  t_point *pts =new t_point[w * h + 1]();

    for (int y = 0; y < h; y++) {
        for (int x = 0; x < w; x++) {
            float Ix = pixval32f(deriX, x, y);
            float Iy = pixval32f(deriY, x, y);
            float Ixy = pixval32f(deriXY, x, y);

            float det = Ix * Iy - Ixy * Ixy;
            float tr = Ix + Iy;

            float cim = det - k * tr * tr;
            cims[y * w + x] = cim;
            vals[y * w + x] = cim;

//          pts[y * w + x].x = x;
//          pts[y * w + x].y = y;
//          pts[y * w + x].val = cim;
        }
    }

//  cout << "ok\n";
//  //sort(pts, pts + w * h, cmp);
//  qsort(pts, sizeof(t_point), w * h, _cmp);
//  cout << "ok\n";
//  int num = w * h - 1;
//  int feat = 0;
//  int contentSize = filterSize;
//  while (num-- >= 0) {
//      int x = pts[num].x;
//      int y = pts[num].y;
//      if (x < contentSize || x > w - contentSize ||
//          y < contentSize || y > w - contentSize)
//          continue;
//      if (is_extremun(cims, pts[num].x, pts[num].y, w, h, filterSize * 4)) {
//          drawPoint(printImg, pts[num].x, pts[num].y);
//          feat++;
//          if (feat > 500)
//              break;
//      }
//  }

    sort(vals, vals + w * h);
    //float thres = 7000;
    int num =  w * h > 4000 ? 4000 : w * h * 3 / 4;
    float thres = vals[w * h - num];
    t_point *pts = new t_point[4000];
    int count = 0;

    for (int y = filterSize; y < h - filterSize; y++) {
        for (int x = filterSize; x < w- filterSize; x++) {
            if (cims[y * w + x] >= thres && is_extremun(cims, x, y, w, h, filterSize)) {
//                drawPoint(printImg, x, y);
                if (cims[y * w + x] == vals[w * h - 1]) {
                    drawPoint(printImg, x, y);
                }
                pts[count].x = x;
                pts[count++].y = y;
            }
        }
    }

    float **desc;
    int descSize;

    desc = describe_feature(src, pts, count, descSize);

//  cout << "\n\n****************\n";
//  for (int i = 0; i < count; i++) {
//      for (int j = 0; j < descSize; j++) {
//          cout << desc[i][j] << "\t";
//      }
//      cout << endl;
//  }

    /*return the result*/
    *ptsDes = desc;
    *npts = count;
    *ndes = descSize;
    *_pts = pts;

    cvNamedWindow("1", CV_WINDOW_AUTOSIZE);
    cvShowImage("1", printImg);
    cvWaitKey(0);

    delete [] vals;
    delete [] cims;
    cvReleaseImage(&src);
    cvReleaseImage(&deriX);
    cvReleaseImage(&deriY);
    cvReleaseImage(&deriXY);

    return printImg;
}