1

我尝试修改FacePreview.java为 Android 提供的示例,并且由于该代码始终以横向模式打开您的相机,因此我在打开相机后添加了方向逻辑Preview.java

mCamera.setDisplayOrientation(90);

当我运行程序时,我发现总是对象检测,即cvHaarDetectObjects仅在手机处于横向模式时才有效,在其他模式主要是纵向时,它根本不会检测到任何人脸。这背后的原因是什么?

faces = cvHaarDetectObjects(
    grayImage,
    classifier,
    storage,
    1.1,
    3,
    CV_HAAR_FEATURE_MAX
      | CV_HAAR_SCALE_IMAGE 
      | CV_HAAR_FIND_BIGGEST_OBJECT
      | CV_HAAR_DO_ROUGH_SEARCH
      | CV_HAAR_DO_CANNY_PRUNING);

faces.total0当手机处于纵向模式或方向与横向不同时,始终返回。

我尝试修改地方,但没有找到预期的。

4

1 回答 1

1

似乎在 OpenCV/JavaCV Haar 分类器(xml 文件)中是使用风景图像进行训练的。您可以在人脸检测之前旋转您的 Mat 对象:

public static opencv_core.Mat rotate(opencv_core.Mat src, int angle) {
    opencv_core.IplImage iplSrc = src.asIplImage();
    opencv_core.IplImage iplRes = opencv_core.IplImage.create(
        iplSrc.height(),
        iplSrc.width(),
        iplSrc.depth(),
        iplSrc.nChannels()
    );
    cvTranspose(iplSrc, iplRes);
    cvFlip(iplRes, iplRes, angle);
    return new opencv_core.Mat(iplRes);

因此,如果您从某个图像文件加载 Mat,您可以执行以下操作:

opencv_core.Mat mat = imread(imagePath, CV_LOAD_IMAGE_GRAYSCALE);
int orientation = ExifInterface.ORIENTATION_UNDEFINED;
try {
     ExifInterface exif = new ExifInterface(imagePath);
     orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
} catch (IOException e) {
     e.printStackTrace();
}
switch (orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
       mat = MatUtils.rotate(mat, 90);
       break;
}
于 2015-02-04T20:26:39.017 回答