2011-07-04 54 views
0

IAM交易與多尺度圖像,3種尺寸調整矩形:原始的,半&雙 我提取它們中的每所連接的組件分開然後執行一些計算使用cvTransform和cvGetAffineTransform的OpenCV

最後我要映射的邊界原始圖像

在這裏連接部件到原來的位置和大小的一半&雙刻度的矩形是我的調整和重新定位邊框

 Matrix<int> src = new Matrix<int>(3, 2,3); 
     Matrix<int> dst = new Matrix<int>(3, 2,2); 

     IntPtr mat = CvInvoke.cvCreateMat(2, 3, MAT_DEPTH.CV_32F); 

     src[0,0]=componentBRect.X; 
     src[0,1]=componentBRect.Y ; 
     src[1,0]=componentBRect.Right; 
     src[1,1]=componentBRect.Y; 
     src[2,0]=componentBRect.X; 
     src[2,1]=componentBRect.Bottom; 





     CvInvoke.cvGetAffineTransform(img2, img, mat); //img is the original image & img2 has been resized to 1/2 imgWidth and 1/2 imgHeight 

     CvInvoke.cvTransform(src.Ptr, dst.Ptr, mat, IntPtr.Zero); 
的代碼

它應該獲得DST點reszied和搬遷 但遺憾的是相同的點再次返回,我認爲它返回一個單位矩陣

mat= 
|1 0 0 | 
|0 1 0 | !! 

任何建議有一個與getAffineTransform一個問題?或有另一種方式做我想做什麼不使用仿射變換

在此先感謝

回答

1

我已經解決了它,

我只是發現了另外一個功能 - 這是cvConvertScale

 for (int i = 0; i < Brectangles.Count; i++) { 

      src[0, 0] = Brectangles[i].X; //top left 
      src[0, 1] = Brectangles[i].Y; 
      src[1, 0] = Brectangles[i].Right; //top right 
      src[1, 1] = Brectangles[i].Y; 
      src[2, 0] = Brectangles[i].X; //bottom left 
      src[2, 1] = Brectangles[i].Bottom; 


      CvInvoke.cvConvertScale(src, dst, rescaleFactor, 0); // rescaleFactor variable is 2 for half size & 0.5 for double size 

      temp.X = dst[0, 0]; 
      temp.Y = dst[0, 1]; 
      temp.Width = dst[1, 0] - dst[0, 0]; 
      temp.Height = dst[2, 1] - dst[0, 1]; 

      Brectangles[i] = temp; 


     } 

它調整矩形大小並將其重新定位在適當的位置是新大小