android4.0 FaceDetection 노트
5930 단어 Android4.0
관련 설명은 다음과 같습니다.
frameworks/base/docs/html/guide/topics/media/camera.jd
시작 코드는camera에 있습니다.jd에서 찾으셔도 돼요.
packages/apps/Camera/src/com/android/camera/Camera.java에서 찾으면 구체적인 코드는 말하지 않겠습니다.
일반 시작점은 startFaceDetection 함수
startFaceDetection 함수의 대략적인 내용은 다음과 같습니다.
/*Your application must start the face detection function each time you start (or restart) the
camera preview. Create a method for starting face detection so you can call it as needed, as shown
in the example code below.*/
public void startFaceDetection(){
// Try starting Face Detection
....
// start face detection only *after* preview has started
if (params.getMaxNumDetectedFaces() > 0){
// camera supports face detection, so can start it:
mCamera.startFaceDetection();
}
}
우선 하드웨어가 이 기능을 지원하는지 판단한다
getMaxNumDetectedFaces 함수
frameworks/base/core/java/android/hardware/Camera.java
내용은 다음과 같습니다.
/**
* Gets the maximum number of detected faces supported. This is the
* maximum length of the list returned from {@link FaceDetectionListener}.
* If the return value is 0, face detection of the specified type is not
* supported.
*
* @return the maximum number of detected face supported by the camera.
* @see #startFaceDetection()
*/
public int getMaxNumDetectedFaces() {
return getInt(KEY_MAX_NUM_DETECTED_FACES_HW, 0);
}
KEYMAX_NUM_DETECTED_FACES_HW는 일반적으로HAL층 initDefaultParameters 함수에 설정되어 있으며, 설정은 다음과 같다.
p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, "1"); //add by dao set the max face detectctor number
init Default Parameters에서 이와 같은 코드는 다른 것은 붙이지 않겠습니다.
mCamera.startFaceDetection();이거 집행하는 거예요.
frameworks/base/core/java/android/hardware/Camera.java의 startFaceDetection 함수는 다음과 같습니다.
/**
* Starts the face detection. This should be called after preview is started.
* The camera will notify {@link FaceDetectionListener} of the detected
* faces in the preview frame. The detected faces may be the same as the
* previous ones. Applications should call {@link #stopFaceDetection} to
* stop the face detection. This method is supported if {@link
* Parameters#getMaxNumDetectedFaces()} returns a number larger than 0.
* If the face detection has started, apps should not call this again.
*
* <p>When the face detection is running, {@link Parameters#setWhiteBalance(String)},
* {@link Parameters#setFocusAreas(List)}, and {@link Parameters#setMeteringAreas(List)}
* have no effect. The camera uses the detected faces to do auto-white balance,
* auto exposure, and autofocus.
*
* <p>If the apps call {@link #autoFocus(AutoFocusCallback)}, the camera
* will stop sending face callbacks. The last face callback indicates the
* areas used to do autofocus. After focus completes, face detection will
* resume sending face callbacks. If the apps call {@link
* #cancelAutoFocus()}, the face callbacks will also resume.</p>
*
* <p>After calling {@link #takePicture(Camera.ShutterCallback, Camera.PictureCallback,
* Camera.PictureCallback)} or {@link #stopPreview()}, and then resuming
* preview with {@link #startPreview()}, the apps should call this method
* again to resume face detection.</p>
*
* @throws IllegalArgumentException if the face detection is unsupported.
* @throws RuntimeException if the method fails or the face detection is
* already running.
* @see FaceDetectionListener
* @see #stopFaceDetection()
* @see Parameters#getMaxNumDetectedFaces()
*/
public final void startFaceDetection() {
if (mFaceDetectionRunning) {
throw new RuntimeException("Face detection is already running");
}
_startFaceDetection(CAMERA_FACE_DETECTION_HW);
mFaceDetectionRunning = true;
}
_startFaceDetection은 JNI에서, CAMERAFACE_DETECTION_HW에서 초기화 값은 0입니다. 이 파일의 시작에 정의가 있습니다.
frameworks/base/core/jni/androidhardware_Camera.cpp를 찾을 수 있습니다startFaceDetection에 해당하는 함수:
{ "_startFaceDetection",
"(I)V",
(void *)android_hardware_Camera_startFaceDetection },
대응:androidhardware_Camera_startFaceDetection:
static void android_hardware_Camera_startFaceDetection(JNIEnv *env, jobject thiz,
jint type)
{
LOGV("startFaceDetection");
JNICameraContext* context;
sp<Camera> camera = get_native_camera(env, thiz, &context);
if (camera == 0) return;
status_t rc = camera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, type, 0);
if (rc == BAD_VALUE) {
char msg[64];
snprintf(msg, sizeof(msg), "invalid face detection type=%d", type);
jniThrowException(env, "java/lang/IllegalArgumentException", msg);
} else if (rc != NO_ERROR) {
jniThrowRuntimeException(env, "start face detection failed");
}
}
여기camera->sendCommand 대응
device/samsung/common/s5p/libcamera/SecCameraHWInterface.cpp 파일의 sendCommand 함수는 다음과 같습니다
status_t CameraHardwareSec::sendCommand(int32_t command, int32_t arg1, int32_t arg2)
{
return BAD_VALUE;
}
여기까지 호출하면 끝이야.
서로 다른 산가camera의 라이브러리에 저장된 디렉터리가 다를 수 있으며 이 함수는 구체적인 요구에 따라 수정해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
android4.0 혼동 XmlPullParser 오류오늘,android4.0은proguard-project에 있습니다.txt에 추가 -libraryjars libs/ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.