2017-10-12 4 views
5

मैं the BoofCV Android Demo से दिए गए उदाहरण के साथ BoofCV लाइन पहचान का उपयोग करने का प्रयास कर रहा हूं। इसके लिए मैंने कक्षाओं की प्रतिलिपि बनाई और एंड्रॉइड से कैमरा एपीआई के साथ सब कुछ सेट अप किया। हालांकि डेमो लैंडस्केप ओरिएंटेशन का उपयोग कर रहा है, मेरी गतिविधि को पोर्ट्रेट में होना आवश्यक है, लेकिन जब कैमरे को सेट किया जाता है तो बाईं ओर 90 डिग्री घुमाया जाता है। जब मैं कैमरे को तदनुसार सेट करने का प्रयास करता हूं, तो कुछ भी नहीं होता है। मैं प्रयोग किया है:BoofCV लगातार कैमरे के पूर्वावलोकन को बाईं ओर क्यों घुमाता है?

  • Camera.setDisplayOrientation(90)
  • Camera.setParameters("orientation", "portrait")

थोड़ी देर मैं पता लगा है कि यह संबंधित (विभिन्न उपकरणों और API स्तरों पर परीक्षण किया) डिवाइस नहीं है के बाद और यह करने के लिए कुछ भी नहीं है कैमरा एपीआई के साथ-साथ (क्योंकि VideoProcessor.init() फ़ंक्शन पर टिप्पणी करते समय मैं इसे चित्र में प्राप्त करने में कामयाब रहा)।

public class LineProcessor extends Thread implements VideoProcessing { 

    /** 
    * Lock for reading and writing images with processing and render 
    */ 
    private final Object lockGui = new Object(); 

    /** 
    * Lock used when converting the video stream. 
    */ 
    private final Object lockConvert = new Object(); 

    private Paint mPaint; 
    private ImageType<GrayU8> imageType; 
    private GrayU8 image; 
    private GrayU8 image2; 
    private volatile boolean requestStop = false; 
    private volatile boolean running = false; 
    private int outputWidth; 
    private int outputHeight; 
    private View view; 
    private Thread thread; 

    private DetectLine detector; 
    private FastQueue<LineSegment2D_F32> lines = new FastQueue<LineSegment2D_F32>(LineSegment2D_F32.class,true); 
    private Bitmap bitmap; 
    private byte[] storage; 

    private double scale; 
    private double tranX,tranY; 

    /** 
    * Creates a new Line Processor from a Line Detector 
    * @param detector the Line Detector Segment 
    */ 
    public LineProcessor(DetectLine detector) { 
     this.imageType = ImageType.single(GrayU8.class); 
     this.detector = detector; 

     mPaint = new Paint(); 
     mPaint.setColor(Color.RED); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(2.0f); 
    } 

    @Override 
    public void init(View view, Camera camera) { 
     synchronized (lockGui) { 
      this.view = view; 

      Camera.Size size = camera.getParameters().getPreviewSize(); 
      outputWidth = size.width; 
      outputHeight = size.height; 
      declareImages(size.width,size.height); 
     } 

     // start the thread for processing 
     running = true; 
     start(); 
    } 



    @Override 
    public void onDraw(Canvas canvas) { 
     synchronized (lockGui) { 
      // the process class could have been swapped 
      if(image == null) 
       return; 

      int w = view.getWidth(); 
      int h = view.getHeight(); 

      // fill the window and center it 
      double scaleX = w/(double)outputWidth; 
      double scaleY = h/(double)outputHeight; 

      scale = Math.min(scaleX,scaleY); 
      tranX = (w-scale*outputWidth)/2; 
      tranY = (h-scale*outputHeight)/2; 

      canvas.translate((float)tranX,(float)tranY); 
      canvas.scale((float)scale,(float)scale); 

      render(canvas, scale); 
     } 
    } 



    @Override 
    public void convertPreview(byte[] bytes, Camera camera) { 
     if(thread == null) 
      return; 

     synchronized (lockConvert) { 
      ConvertUtils.nv21ToGray(bytes, image.width, image.height, image); 

     } 
     // wake up the thread and tell it to do some processing 
     thread.interrupt(); 
    } 

    @Override 
    public void stopProcessing() { 
     if(thread == null) 
      return; 

     requestStop = true; 
     while(running) { 
      // wake the thread up if needed 
      thread.interrupt(); 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) {} 
     } 
    } 

    @Override 
    public void run() { 
     thread = Thread.currentThread(); 
     while(!requestStop) { 
      synchronized (thread) { 
       try { 
        wait(); 
        if(requestStop) 
         break; 
       } catch (InterruptedException e) {} 
      } 

      // swap gray buffers so that convertPreview is modifying the copy which is not in use 
      synchronized (lockConvert) { 
       GrayU8 tmp = image; 
       image = image2; 
       image2 = tmp; 
      } 

      process(image2); 

      view.postInvalidate(); 
     } 
     running = false; 
    } 

    /** 
    * Scaling applied to the drawing canvas 
    */ 
    public double getScale() { 
     return scale; 
    } 

    /** 
    * Translation x applied to the drawing canvas 
    */ 
    public double getTranX() { 
     return tranX; 
    } 

    /** 
    * Translation y applied to the drawing canvas 
    */ 
    public double getTranY() { 
     return tranY; 
    } 


    public void process(GrayU8 gray) { 

     if(detector != null) { 
      List<LineParametric2D_F32> found = detector.detect(gray); 

      synchronized (lockGui) { 
       ConvertUtils.grayToBitmap(gray,bitmap,storage); 
       lines.reset(); 
       for(LineParametric2D_F32 p : found) { 
        LineSegment2D_F32 ls = ConvertUtils.convert(p, gray.width,gray.height); 
        lines.grow().set(ls.a,ls.b); 
       } 
      } 

     } 
    } 

    protected void render(Canvas canvas, double imageToOutput) { 

     canvas.drawBitmap(bitmap,0,0,null); 

     for(LineSegment2D_F32 s : lines.toList()) { 
      canvas.drawLine(s.a.x,s.a.y,s.b.x,s.b.y,mPaint); 
     } 

} 

    protected void declareImages(int width , int height) { 
     image = imageType.createImage(width, height); 
     image2 = imageType.createImage(width, height); 

     bitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); 
     storage = ConvertUtils.declareStorage(bitmap,storage); 
    } 
} 

:

यह कुछ समय मैं अभी भी समझ नहीं क्यों VideoProcessor बाईं ओर छवि घूर्णन रहता है के लिए प्रयास करने के बाद ...

यहाँ VideoProcessor के लिए मेरे कोड है कक्षा I से बढ़ा है VideoProcessing.java

क्या किसी को इस मुद्दे के साथ कोई अनुभव है?

+3

तुम कोशिश किया कैमरा रोटेशन के आधार पर कैनवास घूर्णन? – noongiya95

+0

हाँ कि यह वास्तव में समस्या का समाधान है ... BoofCV अपनी सामग्री को एक नए कैनवास पर खींचता है और किसी भी कारण से इसे घुमाता है .... मैंने प्रक्रिया फ़ंक्शन को मूल प्रश्न में पोस्ट करने के लिए बदल दिया है और यह पूरी तरह से काम करता है ठीक! आपका बहुत बहुत धन्यवाद! – 1resu

उत्तर

2

समाधान बदल रहा है निम्नलिखित करने के लिए समारोह प्रस्तुत करना:

protected void render(Canvas canvas, double imageToOutput) { 

     canvas.rotate(90, 640f/2, 480f/2); 
     canvas.scale(480f/640f, 640f/480f, 640f/2, 480f/2); 
     canvas.drawBitmap(bitmap,0,0,null); 

     for(LineSegment2D_F32 s : lines.toList()) { 
      canvas.drawLine(s.a.x,s.a.y,s.b.x,s.b.y,mPaint); 
     } 
} 

मैंने सोचा था कि इस से पहले साफ रास्ता नहीं था, लेकिन यह वास्तव में केवल काम करने का तरीका है ....

संबंधित मुद्दे