我正在尝试使用从 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/