static int CheckImage(IplImage* image, char* file, char* /*funcname*/)
{
    //printf("loading %s\n", file );
    IplImage* read = cvLoadImage( file, 1 );

    if( !read )
    {
        trsWrite( ATS_CON | ATS_LST, "can't read image\n" );
        return 1;
    }

    int err = 0;

#if 0
    {
        IplImage* temp = cvCloneImage( read );
        cvAbsDiff( image, read, temp );
        cvThreshold( temp, temp, 0, 255, CV_THRESH_BINARY );
        cvvNamedWindow( "Original", 0 );
        cvvNamedWindow( "Diff", 0 );
        cvvShowImage( "Original", read );
        cvvShowImage( "Diff", temp );
        cvvWaitKey(0);
        cvvDestroyWindow( "Original" );
        cvvDestroyWindow( "Diff" );
    }
#endif

    cvAbsDiff( image, read, read );
    cvThreshold( read, read, 0, 1, CV_THRESH_BINARY );
    err = cvRound( cvNorm( read, 0, CV_L1 ))/3;

    cvReleaseImage( &read );
    return err;
}
示例#2
0
void CHmiDsi::WarpToRightView (float *left0, IplImage *disp0, IplImage *occmask0, float *warped0, IplImage *occmask0_right_view)
{
	int scaled_imgW = disp0->width;
	int scaled_imgH = disp0->height;

	IplImage *disp0_right = cvCloneImage (disp0);
	cvZero (disp0_right);
	cvZero (occmask0_right_view);

	// warp to derive disparity map of second view
	for (int y = 0; y < scaled_imgH; y++)
		for (int x = 0; x < scaled_imgW; x++)
		{
			int d = (int) (uchar) disp0->imageData[y * disp0->widthStep + x];

			if (x - d < 0 || (occmask0->imageData [y * occmask0->widthStep + x]) == 0) continue;

			int curdisp_right = (int) (uchar) disp0_right->imageData[y * disp0_right->widthStep + x - d];
			if (curdisp_right < d)
			{
				disp0_right->imageData[y * disp0_right->widthStep + x - d] = (uchar) d;
				occmask0_right_view->imageData[y * occmask0_right_view->widthStep + x - d] = (uchar) 255;
			}
		}
	
	// use disparity map of second view to generate warped right view
	float *dst = warped0;
	float *src;

	for (int y = 0; y < scaled_imgH; y++)
		for (int x = 0; x < scaled_imgW; x++)
		{
			if (occmask0_right_view->imageData [y * occmask0_right_view->widthStep + x] != 0)
			{
				int d = (int) (uchar) disp0_right->imageData[y * disp0_right->widthStep + x];
				src = left0 + (y * disp0_right->width + x + d) * 3;
				*dst = *src; dst++; src++;
				*dst = *src; dst++; src++;
				*dst = *src; dst++;
			}
			else
			{
				*dst = 0.f; dst++;
				*dst = 0.f; dst++;
				*dst = 0.f; dst++;
			}		
		}

	#ifdef SHOW_HMI_STEPS
		cvConvertScale(disp0_right, disp0_right, 16);
		cvvNamedWindow ("disp_right", CV_WINDOW_AUTOSIZE);
		cvMoveWindow ("disp_right", disp0_right->width, 0);
		cvShowImage ("disp_right", disp0_right);
		cvvNamedWindow ("occmask0_right", CV_WINDOW_AUTOSIZE);
		cvMoveWindow ("occmask0_right", 0, 0);
		cvShowImage ("occmask0_right", occmask0_right_view);
	#endif

	cvReleaseImage (&disp0_right);
}
示例#3
0
void showfloatarray (float *data, int imgW, int imgH, int numchannels, float scale, CvPoint pos, char *txt, float addvalue = 0.0)
{
	IplImage *show;

	if (numchannels == 1)
		show = cvCreateImage (cvSize(imgW, imgH), IPL_DEPTH_8U, 1);
	else if (numchannels == 3)
		show = cvCreateImage (cvSize(imgW, imgH), IPL_DEPTH_8U, 3);

	for (int y = 0; y < imgH; y++)
		for (int x = 0; x < imgW; x++)
			if (numchannels == 1)
			{
				int val = (int) ((data[y * imgW + x] + addvalue) * scale) + 0.5;
				if (val < 0) val *= -1;
				if (val > 255) val = 255;
				show->imageData [y * show->widthStep + x] = val;
			}
			else if (numchannels == 3)
				for (int c = 0; c < 3; c++)
				{
					int val = (int) ((data[(y * imgW + x) * 3 + 2 - c] + addvalue) * scale) + 0.5;
					if (val < 0) val *= -1;
					if (val > 255) val = 255;
					show->imageData [y * show->widthStep + 3 * x + c] = val;
				}

	cvvNamedWindow (txt, CV_WINDOW_AUTOSIZE);
	cvMoveWindow (txt, pos.x, pos.y);
	cvShowImage (txt, show);
	
	cvReleaseImage (&show);
}
示例#4
0
void show_points( IplImage* gray, CvPoint2D32f* u, int u_cnt, CvPoint2D32f* v, int v_cnt,
                  CvSize etalon_size, int was_found )
{
    CvSize size;
    int i;

    cvGetImageRawData( gray, 0, 0, &size );
    
    IplImage* rgb = cvCreateImage( size, 8, 3 );
    cvMerge( gray, gray, gray, 0, rgb );

    if( v )
    {
        for( i = 0; i < v_cnt; i++ )
        {
            cvCircle( rgb, cvPoint(cvRound(v[i].x), cvRound(v[i].y)), 3, CV_RGB(255,0,0), CV_FILLED);
        }
    }

    if( u )
    {
        for( i = 0; i < u_cnt; i++ )
        {
            cvCircle( rgb, cvPoint(cvRound(u[i].x), cvRound(u[i].y)), 3, CV_RGB(0,255,0), CV_FILLED);
        }
    }

    cvDrawChessboardCorners( rgb, etalon_size, v, v_cnt, was_found );

    cvvNamedWindow( "test", 0 );
    cvvShowImage( "test", rgb );

    cvvWaitKey(0);
}
示例#5
0
// plots disparity map with occlusions in red
void ShowOcclusionGraph (kolmogorov::qpbo::QPBO<REAL> *q, Proposal *proposal1, Proposal *proposal2, float scale, char *fn)
{
	int imgW = proposal1->imgW;
	int imgH = proposal1->imgH;

	IplImage *disp = cvCreateImage(cvSize(imgW, imgH), IPL_DEPTH_8U, 3);
	IplImage *occ = cvCreateImage(cvSize(imgW, imgH), IPL_DEPTH_8U, 3);

	for (int y = 0; y < imgH; y++)
		for (int x = 0; x < imgW; x++)
		{
			int disp_node = q->GetLabel(y * imgW + x);

			Proposal *solution = 0;
			if (disp_node == 0)
				solution = proposal1;
			else if (disp_node == 1)
				solution = proposal2;
			else
			{
				disp->imageData[y * disp->widthStep + 3 * x + 0] = 0;
				disp->imageData[y * disp->widthStep + 3 * x + 1] = 255;
				disp->imageData[y * disp->widthStep + 3 * x + 2] = 0;

				occ->imageData[y * disp->widthStep + 3 * x + 0] = 0;
				occ->imageData[y * disp->widthStep + 3 * x + 1] = 255;
				occ->imageData[y * disp->widthStep + 3 * x + 2] = 0;

				continue;
			}

			float d = solution->surfacemodels[y * imgW + x]->PointDisp(cvPoint(x, y), scale);
			d *= scale;
			int int_d = min ((int) (d + 0.5f), 255);

			for (int c = 0; c < 3; c++)
				disp->imageData[y * disp->widthStep + 3 * x + c] = (uchar) int_d;

			int occidx;

			if (disp_node == 0)
				occidx = y * imgW + x + imgW * imgH;
			else
				occidx = y * imgW + x + 2 * imgW * imgH;

			int occluded = q->GetLabel(occidx);

			if (hasSwappedMeaning(occidx))
				occluded = (!occluded);

			if (occluded)
			{
				occ->imageData[y * disp->widthStep + 3 * x + 0] = 0;
				occ->imageData[y * disp->widthStep + 3 * x + 1] = 0;
				occ->imageData[y * disp->widthStep + 3 * x + 2] = 255;
			}
			else
			{
				for (int c = 0; c < 3; c++)
					occ->imageData[y * disp->widthStep + 3 * x + c] = 
						disp->imageData[y * disp->widthStep + 3 * x + c];
			}
		}


	#ifdef SHOWIMAGES
		cvvNamedWindow ("graph occ", CV_WINDOW_AUTOSIZE);
		cvShowImage ("graph occ", occ);
	#endif

	cvSaveImage (fn, occ);

	cvReleaseImage (&disp);
	cvReleaseImage (&occ);
}
示例#6
0
文件: camcal.cpp 项目: zxie/surgical
//
// Function: FindCorners
// Purpose : This function finds the corner points in the calibration images
//           using opencv functions cvFindChessBoardCornerGuesses and
//           cvFindCornerSubPix.  After image pixel coordinates are found, their
//           respective world coordinates are assigned. (z coordinate is always
//           zero). When the function cannot find the specified number of
//           coordinates in the image, the image is discarded because of the
//           added complexity in assigning their world coordinates.
// Output  : uveff : coordinates of the chessborder in image plane.
//           XYZeff: coordinates of uveff w.r.t World Coordinate System
//           m_effective_image_no : number of images processed.
//----------------------------------------------------------------------------
void camcal::FindCorners()
{
   IplImage* img  = 0;
   IplImage* img0 = 0;
   IplImage* img1 = 0;
   IplImage* greyimg = 0;

   CvFont dfont;
   cvInitFont (&dfont, CV_FONT_VECTOR0, 0.3, 0.3, 0.0f, 1);

   CvPoint onecorner;

   int numcorners = m_corner_no;

   CvPoint2D64d* uv  = new CvPoint2D64d[m_image_number * m_corner_no];
   CvPoint3D64d* XYZ = new CvPoint3D64d[m_image_number * m_corner_no];

   CvPoint2D32f* corners = new CvPoint2D32f[m_corner_no];
   CvMemStorage* storage = 0;

   m_effective_image_no=-1;

   for( int imgnum=0; imgnum<m_image_number; imgnum++ )
   {
      numcorners = m_corner_no;

      img = m_input_images[imgnum];

      imgsize.width = img->width;
      imgsize.height= img->height;

      img0 = cvCloneImage(img);
      img1 = cvCloneImage(img);
      greyimg = cvCreateImageHeader(imgsize,IPL_DEPTH_8U,1);
      cvCreateImageData(greyimg);

      cvCvtColor(img, greyimg, CV_RGB2GRAY);
      img0 = cvCloneImage(greyimg);

      cvFindChessBoardCornerGuesses(greyimg,
                                    img0,
                                    storage,
                                    cvSize(m_x_height,m_x_width),
                                    corners,
                                    &numcorners);

      if( numcorners != m_corner_no ) {
         cvReleaseImage( &img0 );
         cvReleaseImage( &img1 );
         cvReleaseImage( &greyimg );
         continue;
      }
      else
         m_effective_image_no++;

      // draw a circle at each corner found
      for( int t = 0; t < numcorners; t++ )
      {
         onecorner.x = (int)corners[t].x;
         onecorner.y = (int)corners[t].y;

         cvCircle(img1, onecorner, 8, CV_RGB(0,255,0),2);
         // image, center, radius, color, thickness
      }

      // Find sub-corners
      cvFindCornerSubPix(greyimg,
                         corners,
                         numcorners,
                         cvSize (m_x_height,m_x_width),
                         cvSize(-1, -1),
                         cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10, 0.1));

      // correct order
      if( m_apply_ordering ){
         CvPoint3D32f init = FindRectangleCorner( corners, numcorners );
         if( init.z < m_x_height*m_x_width )
            SortPoints(corners, numcorners, &init);
         else
         {
            cout<<"Sort Error";
            cvReleaseImage( &img0 );
            cvReleaseImage( &img1 );
            cvReleaseImage( &greyimg );
            m_effective_image_no--;
            continue;
         }
      }

      //draw a circle and put the corner number at each subcorner found
      for( int t = 0; t < numcorners; t++ )
      {
         onecorner.x = (int)corners[t].x;
         onecorner.y = (int)corners[t].y;

         cvCircle(img1, onecorner, 3, CV_RGB(255,0,0),1);

         char buf[10];
         sprintf( buf, "%d", t );

//          cvPutText(img1,numbers[t], cvPoint(onecorner.x, onecorner.y + 20), &dfont, CV_RGB(255,0,0));
         cvPutText(img1, buf, cvPoint(onecorner.x, onecorner.y + 20), &dfont, CV_RGB(255,0,0));
      }

      // CAMERA CALIBRATION PART
      for( int currPoint=0; currPoint < numcorners; currPoint++ )
      {
         uv[ m_effective_image_no*numcorners + currPoint].x = corners[currPoint].x;
         uv[ m_effective_image_no*numcorners + currPoint].y = corners[currPoint].y;
      }

      int index;
      for( int i = 0; i < m_x_width; i++ )
      {
         for( int j = 0; j < m_x_height; j++ )
         {
            index = m_effective_image_no*numcorners + i*m_x_height+j;

            XYZ[ index ].x = m_grid_width *(m_x_width -i);
            XYZ[ index ].y = m_grid_height*(m_x_height-j);
            XYZ[ index ].z = 0;
         }
      }

      if( m_display_corners )
      {
         cvvNamedWindow( "image", 1 );
         cvvShowImage("image",img1);
         cvvWaitKey(0);
         cvDestroyWindow( "image" );
      }

//		cvReleaseImage( &img );
      cvReleaseImage( &img0 );
      cvReleaseImage( &img1 );
      cvReleaseImage( &greyimg );

   } //loop to next image
   free (corners);

   m_effective_image_no++;

   delete []uveff ; uveff  =NULL;
   delete []XYZeff; XYZeff = NULL;

   if( m_image_number == m_effective_image_no ){
      uveff  = uv;  uv  = NULL;
      XYZeff = XYZ; XYZ = NULL;
   }
   else
   {
      int size = m_effective_image_no * m_corner_no;
      uveff  = new CvPoint2D64d[size];
      XYZeff = new CvPoint3D64d[size];

      for(int ph=0; ph<size; ph++)
      {
         uveff [ph] = uv [ph];
         XYZeff[ph] = XYZ[ph];
      }
      delete []uv;  uv  = NULL;
      delete []XYZ; XYZ = NULL;
   }
}