示例#1
0
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;


}
示例#2
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);
}                                    
示例#3
0
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);
}