int main() { //char imgName[] = "edge.jpg"; //#define DIRECT #ifdef DIRECT char imgName[] = "../fig/__tmp_edge.png"; IplImage* iplEdge=cvLoadImage(imgName, 0); #else //char imgName[] = "../../RandomImages/camrect2_1199740292_793000_+39.953758_-75.210335.jpg"; char imgName[] = "../../YorkUrbainDB/P1020822/P1020822.jpg"; //char imgName[] = "../../YorkUrbainDB/P1020171/P1020171.jpg"; IplImage* iplImg =cvLoadImage(imgName, 0);//grayscale loading IplImage* iplEdge = 0; cv::Mat mat_img(iplImg ); cv::Mat m_edge; cv::Canny(mat_img,m_edge,CANNY_THRESH,CANNY_THRESH*4,CANNY_MASK); iplEdge = new IplImage(m_edge); #ifdef DEBUG cvSaveImage("edge.jpg", iplEdge); #endif #endif if(!iplEdge){ printf("Could not load image file: %s\n",imgName); return 0; } std::vector< std::vector <CvPoint> > vComp = getEdgeGroup(iplEdge, 30); IplImage* iplEdgeF=cvCreateImage(cvSize(iplEdge->width, iplEdge->height),IPL_DEPTH_8U,1); cvSet(iplEdgeF, cvScalar(0)); Image<uint8> iplEdgeFT(iplEdgeF); for (uint i=0; i<vComp.size();i++) { std::vector<CvPoint> vPt = vComp[i]; int nbPt = vPt.size(); for (int p=0; p<nbPt;p++) iplEdgeFT[ vPt[p].y ][ vPt[p].x ] = 255; } #ifdef DEBUG cvSaveImage("comp.png", iplEdgeF); #endif return 0; }
//get from opensift //get from opensift void FlannMatcher::drawInliers(cv::Mat& image1,cv::Mat& image2, vector<cv::KeyPoint>& keypoints1, vector<cv::KeyPoint>& keypoints2, vector<cv::DMatch>& matches, vector<cv::DMatch>& bestMatches) { IplImage* stacked_img=NULL; IplImage test1=IplImage(image1); IplImage test2=IplImage(image2); IplImage* tmp_img1=&test1; IplImage* tmp_img2=&test2; stacked_img=stack_imgs(tmp_img1,tmp_img2); //change c to mat cv::Mat mat_img(stacked_img,true); //deep copy for(unsigned int i=0;i<matches.size();++i) { cv::Point2f point1; cv::Point2f point2; point1=keypoints1[matches[i].queryIdx].pt; point2.x=keypoints2[matches[i].trainIdx].pt.x; point2.y=keypoints2[matches[i].trainIdx].pt.y+image1.rows; cv::line(mat_img,point1,point2,CV_RGB(255,0,0), 1, 8, 0); } for(unsigned int i=0;i<bestMatches.size();++i) { cv::Point2f point1; cv::Point2f point2; point1=keypoints1[bestMatches[i].queryIdx].pt; point2.x=keypoints2[bestMatches[i].trainIdx].pt.x; point2.y=keypoints2[bestMatches[i].trainIdx].pt.y+image1.rows; cv::line(mat_img,point1,point2,CV_RGB(0,255,0), 1, 8, 0); } cv::imshow("ransac inliers",mat_img); }
void mexFunction(int nout, mxArray *out[], int nin, const mxArray *in[]) { uint8* img; enum {img_i=0, minLength_i} ; enum {c_edgeGroups_i=0, imgEdge_i} ; // int i =cvUseOptimized(1); // printf("optimized -> %d\n", i); /* ------------------------------------------------------------------ ** Check the arguments ** --------------------------------------------------------------- */ if (nin != 2) { mexErrMsgTxt("At least 1 input arguments required"); } if (nout > 2) { mexErrMsgTxt("Too many output arguments"); } img = (uint8*) mxGetData(in[img_i]) ; uint minLength = (uint) mxGetScalar(in[minLength_i]); int imgHeight = mxGetM(in[img_i]) ; int imgWidth = mxGetN(in[img_i]) ; //copy image to OPENCV format IplImage* iplImg = cvCreateImage (cvSize(imgWidth, imgHeight), 8, 1); Image<uint8> iplImgT(iplImg); for (int x = 0; x < imgWidth; x++) for (int y = 0; y < imgHeight; y++) iplImgT[y][x] = getColor(img,imgHeight, x,y); //get edge map cv::Mat mat_img(iplImg); cv::Mat m_edge; cv::Canny(mat_img,m_edge,CANNY_THRESH,CANNY_THRESH*4,CANNY_MASK); IplImage* iplEdge = new IplImage(m_edge); //get edgelist //printf("Computing\n"); std::vector< std::vector <CvPoint> > vComp = getEdgeGroup(iplEdge, minLength); //copy to cell mxArray* vCell = (mxArray*) mxCreateCellMatrix(1,vComp.size() ); //printf("Copying data\n"); for (uint i=0; i<vComp.size();i++) { std::vector<CvPoint> vPt = vComp[i]; int nbPt = vPt.size(); mxArray* mxMat = (mxArray*) mxCreateDoubleMatrix(nbPt,2,mxREAL) ; //arrange un columns double* mat = (double*) mxGetPr(mxMat); for (int p=0; p<nbPt;p++) { mat[p] = vPt[p].y; mat[p+nbPt]= vPt[p].x; } mxSetCell(vCell, i, mxMat); } out[c_edgeGroups_i] = vCell; if (nout >= 2) //return edge image, mostly for debugging { mxArray* mxImgEdge = (mxArray*) mxCreateNumericMatrix(imgHeight,imgWidth,mxUINT8_CLASS,mxREAL); uint8* imgEdge = (uint8*) mxGetPr(mxImgEdge); Image<uint8> iplEdgeT(iplEdge); for (int x = 0; x < imgWidth; x++) for (int y = 0; y < imgHeight; y++) setColor(imgEdge,imgHeight, x,y, iplEdgeT[y][x]); out[imgEdge_i] = mxImgEdge; } delete iplEdge; cvReleaseImage(&iplImg); }