簡體   English   中英

使用opencv的android縱向模式的問題

[英]issues in working with android portrait mode with opencv

我知道這是最重復的問題之一,但是,經過這么多的努力,卻找不到任何可行的解決方案。

盡管對於專家來說這可能是一個簡單的問題,但這確實是一個致命的問題。

我正在研究opencv Haar級聯分類器(例如:人臉檢測,眼對檢測)

我剛剛從“ OpenCV-2.4.9-android-sdk”中獲取了面部檢測示例代碼-示例。

此示例代碼在橫向模式下設置,並且一切正常

但是,我想使分類器在縱向模式下工作。 我知道haar 分類器 不能用於縱向模式

由於opencv使用“ CameraBridgeViewBase ”,因此id 不能使所有控件都以相機的分辨率播放並在屏幕上顯示圖像。(預覽)

現在,當我將屏幕方向設置為“ android:screenOrientation =“ portrait”時 ,圖像將順時針旋轉90度

我嘗試了什么:

要預覽肖像圖像而不旋轉 :我通過添加以下內容修改了“ CameraBridgeViewBase ”中的“ deliverAndDrawFrame”

            Matrix matrix = new Matrix();
            matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,(canvas.getHeight() - mCacheBitmap.getHeight()) / 2);

            if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
                matrix.postRotate(90f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);
            canvas.drawBitmap(mCacheBitmap, matrix, null);

使分類器在縱向模式下工作:我進行了各種置換以及轉置翻轉的組合,以旋轉傳遞給我的灰度圖像,以在“ onCameraFrame”中檢測多比例。

我怎么了

  1. 我無法獲得具有比“ onCameraFrame”更高的原始分辨率的圖像。 如何使圖像的原始或實際或原始質量達到相機傳感器的容量?

  2. 由於我已經為使分類器在縱向模式下工作而付出了很多努力,因此任何可行的建議/示例代碼/參考都將對我有很大幫助。

我找到了解決方案:

  Matrix matrix = new Matrix();
  matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,(canvas.getHeight() - mCacheBitmap.getHeight()) / 2);
  matrix.postRotate(90f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);
  float scale = (float) canvas.getWidth() / (float) mCacheBitmap.getHeight();
  matrix.postScale(scale, scale, canvas.getWidth()/2 , canvas.getHeight()/2 );
  canvas.drawBitmap(mCacheBitmap, matrix, new Paint());

這提供了具有正確比例的人像模式:D請嘗試一下。 我正在使用OpenCV 3.4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM