2014-09-09 3 views
1

OpenCV의 Java 릴리스에서 만든 매트가 있습니다. 이제 이것을 창에서 볼 필요가 있습니다. 어떻게 할 수 있습니까? 나는 그것이 꽤 간단해야한다고 느낀다. 파이썬과 C++에 대한 수많은 예제를 발견하지만, 간단한 자바 예제는 없다. 도움이 필요 하신가요?Java OpenCV에서 매트를 매트에 표시하는 방법은 무엇입니까?

+0

: http://stackoverflow.com/questions/16494916/equivalent-method-for-imshow-in-opencv-java-build – beaker

답변

0

나는 다른 대답을 위해 파이썬 예제를 변환하는 것에 대해 내 손을 썼다. 나는 자바에 대한 경험이별로 없기 때문에 뭔가를 놓친다. 말하자면, 나는 opencv를위한 자바 바인딩을 사용하는 상황에 다소 실망했다. opencv 공식 바인딩 대신 javacv (https://github.com/bytedeco)를 사용하는 것이 좋습니다. imshow 및 마우스 이벤트 후크에 대한 바인딩 누락으로 인해 javacv만큼 유용하지 않습니다.

나는 javacv를 사용하여 나를 위해 작동하는 코드를 제공하며, 파이썬 답변과 다소 비슷하게 동작해야합니다. notre.jpg은 사용자가 제공 한 위키 링크에서 다운로드 할 수 있습니다. 가능하다면 언어를 C++로 바꿀 수도 있습니다. 나는 자바 바인딩으로 인해 용납 할 수없는 버그 나 심각한 유용성 문제가있을 수 있다는 생각이 들었다. 이 게시물이 도움이 될 수

package javaapplication2; 


import java.util.ArrayList; 
import java.util.List; 
import org.bytedeco.javacpp.Pointer; 
import static org.bytedeco.javacpp.opencv_calib3d.*; 
import static org.bytedeco.javacpp.opencv_core.*; 
import static org.bytedeco.javacpp.opencv_highgui.*; 
import static org.bytedeco.javacpp.opencv_imgproc.*; 

public class JavaApplication2 { 

    public static void main(String[] args) throws Exception { 
     System.loadLibrary("opencv_core249");//without these two lines, I get unsatisfied link exception on my pc. you should unzip the contents of opencv-windows-x86_64.jar etc to a folder and run with -Djava.library.path="C:\opencv\javacv-bin\bin" 
     System.loadLibrary("jniopencv_core"); 
     Mat im =new Mat(480,640,CV_8UC3);//dummy 
     Mat dst = null;//new Mat(480,640,CV_8UC1);//dummy 

     final List<Point> pSrc=new ArrayList<Point>(); 
     final List<Point> pDst=new ArrayList<Point>(); 
     /*640x480 camera 
     pDst.add(new Point(120,84)); //cam 
     pDst.add(new Point(525,84));//cam 
     pDst.add(new Point(525,427));//cam 
     pDst.add(new Point(120,427));//cam 
     */ 

     pDst.add(new Point(94,72));//notre 
     pDst.add(new Point(343,72));//notre 
     pDst.add(new Point(343,501));//notre 
     pDst.add(new Point(94,501));//notre 

     namedWindow("src",0); 
     namedWindow("dst",0); 

     MouseCallback mouseSrc= new MouseCallback() { 
      @Override 
      public void call(int event, int x, int y, int flags,Pointer param) {   
       if(event==CV_EVENT_LBUTTONDOWN) 
       { 
        if(pSrc.size()>=4) pSrc.clear(); 
        pSrc.add(new Point(x,y));   
       } 
      } 
     }; 

     setMouseCallback("src", mouseSrc, null); 
     /* this should work but no..bug? 
     MouseCallback moustDst= new MouseCallback() { 
      @Override 
      public void call(int event, int x, int y, int flags,Pointer param) {   
       if(event==CV_EVENT_LBUTTONDOWN) 
       { 
        if(pDst.size()>=4) pDst.clear(); 
        pDst.add(new Point(x,y));   
       } 
      } 
     }; 
     setMouseCallback("dst", moustDst, null);*/ 

     /* uncomment this one to read from webcam 
     VideoCapture cap = new VideoCapture(1); 
     while (cap.read(im)) {*/ 
     im = imread("c:/data/notre.jpg"); 
     while(true){ 
      if(dst==null) 
      { 
       dst=im.clone(); 
      } 
      Mat imD = im.clone(); 
      Mat dstD = dst.clone(); 
      for(int i=0;i<pSrc.size();++i) 
      { 
       circle(imD,pSrc.get(i),4,new Scalar(255,0,0,255),-1,1,1); 
      } 

      if(pSrc.size()==4 && pDst.size()==4) 
      { 
       Mat msrc = new Mat(4,2,CV_64FC1); 
       Mat mdst = new Mat(4,2,CV_64FC1); 
       for(int i=0;i<pSrc.size();++i) 
       { 
        //this is probably not the right way for element access, but I cant find a more straightforward way 
        msrc.asCvMat().put(i,0,(double)pSrc.get(i).x()); 
        msrc.asCvMat().put(i,1,(double)pSrc.get(i).y()); 
       } 

       for(int i=0;i<pDst.size();++i) 
       { 
        mdst.asCvMat().put(i,0,(double)pDst.get(i).x()); 
        mdst.asCvMat().put(i,1,(double)pDst.get(i).y()); 
       } 
       Mat H =findHomography(msrc, mdst); 
       warpPerspective(imD, dstD, H, new Size(dstD.cols(),dstD.rows())); 
      } 
      for(int i=0;i<pDst.size();++i) 
      { 
       circle(dstD,pDst.get(i),4,new Scalar(255,255,0,255),-1,1,1); 
      } 
      imshow("src",imD); 
      imshow("dst",dstD); 

      if(cvWaitKey(1)==27) 
       break; 
     } 
     //cap.release(); 
    }  
} 
관련 문제