android - 如何使用 onPreviewFrame() 中的 byte[] 数据在肖像中使用 OpenCV 人脸检测?

标签 android opencv android-camera

我正在尝试使用从 Camera.PreviewCallback 的 onPreviewFrame() 方法获取的 byte[] 数据来使用 OpenCV 人脸检测

我设法使用下面的代码将数据转换为灰度图像。

    Mat matNew = new Mat(pHeight, pWidth, CvType.CV_8U);
    matNew.put(0, 0, data);
    Mat matrgb = new Mat();
    Imgproc.cvtColor(matNew, matrgb, Imgproc.COLOR_YUV420sp2RGB, 4);
    Mat matgray = new Mat();
    Imgproc.cvtColor(matrgb, matgray, Imgproc.COLOR_RGB2GRAY, 0);

我已在 AndroidManifest 文件中将 android:screenOrientation 设置为“portrait”。

我正在使用 OpenCV JavaDetector

mJavaDetector.detectMultiScale(matgray,faceDetected,1.1,3,0, 新 org.opencv.core.Size(0,0), 新 org.opencv.core.Size(matgray.width(), matgray.height())); 并在使用此检测到的面部上绘制一个矩形

 for (Rect rect : faceDetected.toArray()){
  Core.rectangle(matgray, new Point(rect.x, rect.y), 
new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
                    }

但是,在生成的灰度垫中,仅当我将 Android 手机横向放置时才会进行人脸检测。它不适用于纵向位置。

这篇文章中建议的转置和翻转 How to detect face by portrait mode?似乎不起作用。

有什么办法可以解决这个问题吗?我使用了 Android FaceDetectionListener,在纵向模式下检测脸部似乎没有问题。但是,与 OpenCV 相比,FaceDetectionListener 的功能有限。

任何帮助将不胜感激。谢谢。

最佳答案

类似下面的内容对我来说适用于 AndroidManifest.xml 中的 android:screenOrientation="portrait"

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();

    MatOfRect faces = new MatOfRect();
    Core.flip(mRgba.t(), mRgba, -1);
    Core.flip(mGray.t(), mGray, -1);

    if (mNativeDetector != null)
        mNativeDetector.detect(mGray, faces);

    Rect[] facesArray = faces.toArray();
    for (int i = 0; i < facesArray.length; i++)
        Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 2);

    return mRgba;
}

关于android - 如何使用 onPreviewFrame() 中的 byte[] 数据在肖像中使用 OpenCV 人脸检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380553/

相关文章:

java - 当前 Activity Android的屏幕视频记录

android - 具有多种 View 类型的 ListView 的越界异常

c++ - 我应该在 C++ 中使用 openCV 进行图像处理吗?

opencv - Kinect - 物体识别和计算物体的3D坐标

opencv - 在opencv2.4.6中加载图像

java - 如何检查 ImageView 是否包含 Bitmap?

android - 平板电脑与手机方向限制

java - 当从 Android 的锁定屏幕上单击通知操作时,如何以编程方式解锁屏幕?

android - 使用USB将摄像头连接到Android的外部网络摄像头

java - 相机视频的预览回调