美文网首页
人脸识别开发

人脸识别开发

作者: 黄小楼vincent | 来源:发表于2020-09-24 11:57 被阅读0次

注意点:
1.使用camera时,画面始终无法旋转。
有可能是自己还不太熟悉的原因。
最终使用了camera1+TextureView,
因为这个Camera.setDisplayOrientationAPI很香啊。哈哈

2.onPreviewFrame得到的数据 要进行翻转的。

public class NV21Utils {
    //如果进行编码,注意90、270时,宽高要进行对换。
    public static byte[] NV21_rotate_to_270(byte[] nv21_data, int width, int height) {
        int y_size = width * height;
        int buffser_size = y_size * 3 / 2;
        byte[] nv21_rotated = new byte[buffser_size];
        int i = 0;

// Rotate the Y luma
        for (int x = width - 1; x >= 0; x--) {
            int offset = 0;
            for (int y = 0; y < height; y++) {
                nv21_rotated[i] = nv21_data[offset + x];
                i++;
                offset += width;
            }
        }

// Rotate the U and V color components
        i = y_size;
        for (int x = width - 1; x > 0; x = x - 2) {
            int offset = y_size;
            for (int y = 0; y < height / 2; y++) {
                nv21_rotated[i] = nv21_data[offset + (x - 1)];
                i++;
                nv21_rotated[i] = nv21_data[offset + x];
                i++;
                offset += width;
            }
        }
        return nv21_rotated;
    }

    public static byte[] NV21_rotate_to_180(byte[] nv21_data, int width, int height) {
        int y_size = width * height;
        int buffser_size = y_size * 3 / 2;
        byte[] nv21_rotated = new byte[buffser_size];
        int i = 0;
        int count = 0;
        for (i = y_size - 1; i >= 0; i--) {
            nv21_rotated[count] = nv21_data[i];
            count++;
        }
        for (i = buffser_size - 1; i >= y_size; i -= 2) {
            nv21_rotated[count++] = nv21_data[i - 1];
            nv21_rotated[count++] = nv21_data[i];
        }
        return nv21_rotated;
    }

    public static byte[] NV21_rotate_to_90(byte[] nv21_data, int width, int height) {
        int y_size = width * height;
        int buffser_size = y_size * 3 / 2;
        byte[] nv21_rotated = new byte[buffser_size];
// Rotate the Y luma
        int i = 0;
        int startPos = (height - 1) * width;
        for (int x = 0; x < width; x++) {
            int offset = startPos;
            for (int y = height - 1; y >= 0; y--) {
                nv21_rotated[i] = nv21_data[offset + x];
                i++;
                offset -= width;
            }
        }

// Rotate the U and V color components
        i = buffser_size - 1;
        for (int x = width - 1; x > 0; x = x - 2) {
            int offset = y_size;
            for (int y = 0; y < height / 2; y++) {
                nv21_rotated[i] = nv21_data[offset + x];
                i--;
                nv21_rotated[i] = nv21_data[offset + (x - 1)];
                i--;
                offset += width;
            }
        }
        return nv21_rotated;
    }
}

需要注意的是。如果使用了之前摄像头翻转了90或者270,那么这里的宽高需要对换
也就是说,编码出来的byte[],你如果想要转换成bitmap,那么你之前的width和height需要调换位置。
3.onPreviewFrame出来的数据太快了。灵魂追不上
我使用了rxjava的方式进行拦截,1S执行一次

 Observable.create(ObservableOnSubscribe<ByteArray> { emitter ->
            sender = emitter
        }).throttleLast(1, TimeUnit.SECONDS)
            .subscribe(sendDataObserver!!)
override fun onPreviewFrame(data: ByteArray, camera: Camera) {
        val params = camera.parameters.previewSize;
        if (mWidth != params.width) {
            Logger.i("尺寸不一样,重新进行校正")
            mWidth = params.width;
            mHeight = params.height;
        }
        sender?.onNext(data);
    }

相关文章

网友评论

      本文标题:人脸识别开发

      本文链接:https://www.haomeiwen.com/subject/ihuzyktx.html