2012-02-17 174 views
0

我正在製作能夠進行透視變換圖像的Android應用程序。 我想做類似下面的代碼。使用Android OpenCV進行圖像透視變換

我試過了,但我無法讀取C代碼。請建議我!

感謝,

川昭一

示例代碼(我想這樣做)

#include <cv.h> 
#include <highgui.h> 

int 
main (int argc, char **argv) 
{ 
    IplImage *src_img = 0, *dst_img = 0; 
    CvMat *map_matrix; 
    CvPoint2D32f src_pnt[4], dst_pnt[4]; 

    if (argc >= 2) 
    src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); 
    if (src_img == 0) 
    return -1; 
    dst_img = cvCloneImage (src_img); 

    src_pnt[0] = cvPoint2D32f (150.0, 150.0); 
    src_pnt[1] = cvPoint2D32f (150.0, 300.0); 
    src_pnt[2] = cvPoint2D32f (350.0, 300.0); 
    src_pnt[3] = cvPoint2D32f (350.0, 150.0); 

    dst_pnt[0] = cvPoint2D32f (200.0, 200.0); 
    dst_pnt[1] = cvPoint2D32f (150.0, 300.0); 
    dst_pnt[2] = cvPoint2D32f (350.0, 300.0); 
    dst_pnt[3] = cvPoint2D32f (300.0, 200.0); 

    map_matrix = cvCreateMat (3, 3, CV_32FC1); 
    cvGetPerspectiveTransform (src_pnt, dst_pnt, map_matrix); 

    cvWarpPerspective (src_img, dst_img, map_matrix, CV_INTER_LINEAR +  CV_WARP_FILL_OUTLIERS, cvScalarAll (100)); 


    cvNamedWindow ("src", CV_WINDOW_AUTOSIZE); 
    cvNamedWindow ("dst", CV_WINDOW_AUTOSIZE); 
    cvShowImage ("src", src_img); 
    cvShowImage ("dst", dst_img); 
    cvWaitKey (0); 

    cvDestroyWindow ("src"); 
    cvDestroyWindow ("dst"); 
    cvReleaseImage (&src_img); 
    cvReleaseImage (&dst_img); 
    cvReleaseMat (&map_matrix); 

    return 1; 
} 

我的代碼

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.i(TAG, "onCreate"); 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 
    Resources r = getResources(); 
    Bitmap inputBitmap = BitmapFactory.decodeResource(r, R.drawable.icon); 

    Mat inputMat = Utils.bitmapToMat(inputBitmap); 
    Mat outputMat = inputMat.clone(); 

    List<Point> src_pnt = new ArrayList<Point>(); 
    Point p0 = new Point(75.0, 75.0); 
    src_pnt.add(p0); 
    Point p1 = new Point(75.0, 100.0); 
    src_pnt.add(p1); 
    Point p2 = new Point(100.0, 100.0); 
    src_pnt.add(p2); 
    Point p3 = new Point(100.0, 75.0); 
    src_pnt.add(p3); 
    Mat startM = Converters.vector_Point2f_to_Mat(src_pnt); 

    List<Point> dst_pnt = new ArrayList<Point>(); 
    Point p4 = new Point(75.0, 75.0); 
    dst_pnt.add(p4); 
    Point p5 = new Point(75.0, 100.0); 
    dst_pnt.add(p5); 
    Point p6 = new Point(100.0, 100.0); 
    dst_pnt.add(p6); 
    Point p7 = new Point(100.0, 75.0); 
    dst_pnt.add(p7); 
    Mat endM = Converters.vector_Point2f_to_Mat(dst_pnt); 

    Mat M = new Mat(3, 3, CvType.CV_32F); 
    Core.perspectiveTransform(startM, endM, M); 

    Size size = new Size(200.0, 200.0); 
    Scalar scalar = new Scalar(50.0); 

    Imgproc.warpPerspective(inputMat, outputMat, M, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS, Imgproc.BORDER_DEFAULT, scalar); 

    Bitmap outputBitmap = inputBitmap; 
    Utils.matToBitmap(outputMat, outputBitmap); 
    ImageView imageView1 = (ImageView) findViewById(R.id.imageView1); 
    imageView1.setImageBitmap(outputBitmap); 

} 
+0

你是否設法讓這個工作?我有類似的問題:http://stackoverflow.com/questions/17361693/cant-get-opencvs-warpperspective-to-work-on-android – gleerman 2013-06-28 09:52:33

回答

0

你dst_pnt點是一樣的src_pnt,所以變換矩陣將是身份,並不會改變形象。使用其他點。

其次,我認爲第四個參數來warPerspective(大小)應該是outputMap的大小,所以,如果你想有一個200x200的圖像,而不是

Mat outputMat = inputMat.clone(); 

使用

Mat outputMat = new Mat(200, 200); 
-1

有類似的問題與此,但找到了一個解決方案。有關工作示例,請參見here