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); } }
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; }