이렇게 글이 많아질줄 몰랐는데

벌써 20번째 글

 

이번에는 손 재스처로 카메라 줌인줌아웃, 좌우회전을 제어하도록 구현하려고한다.

 

 

 

 

양손의

index3, thumb3 이 가까이(붙을때) 있을때

 

시작 

 

시작 시점 기준으로

좌우로 멀어지면 줌인

좌우로 가까워지면 줌아웃 

 

 

 

일단 양손의 저 지점(월드계) 사이 거리 출력

 

 

대충 딱 붙이면 커도 40이하 정도 나오고

손 안붙이면 50 이상은 나온다.

 

 

 

 

두손의 엄지 검지가 붙었을때 구분하도록할때 잘동작은 하지만

손이 존재하지 않을때도 관절상 붙어있으면 붙은걸로 오해하고 있어 수정 필요

 

 

이 상황을 생각하고 코드작성을 못해서 좀 지저분해졌지만 일단 진행

 

 

블라즈 헤더

	bool isExistLeft;
	bool isExistRight;

반정규화 본 위치 함수에

처음엔 false하되

중간에 찾으면 true 하도록 추가

 

std::vector<cv::Mat> Blaze::DenormalizeHandLandmarksForBoneLocation(std::vector<cv::Mat> imgs_landmarks, std::vector<cv::Rect> rects)
{

    std::vector<cv::Mat> denorm_imgs_landmarks;
    isExistLeft = false;
    isExistRight = false;

.....



        if (isLeft)
        {
            for (int j = 0; j < squeezed_for_bone.size[0]; j++)
            {
                squeezed_for_bone.at<float>(j, 0) = (squeezed_for_origin.at<float>(j, 1) - squeezed_for_origin.at<float>(0, 1)) * skeletonXRatio * 2 * -1;
                squeezed_for_bone.at<float>(j, 1) = (squeezed_for_origin.at<float>(j, 0) - 0.5) * skeletonYRatio * 2;
                squeezed_for_bone.at<float>(j, 2) = squeezed_for_origin.at<float>(j, 2) * skeletonYRatio * 3 * -1;
                //UE_LOG(LogTemp, Log, TEXT("squeezed_for_bone %d : %f, %f, %f"), j, squeezed_for_bone.at<float>(j, 1), squeezed_for_bone.at<float>(j, 2), squeezed_for_bone.at<float>(j, 3));

            }
            handLeft = squeezed_for_bone.clone();
            handLeftImg = squeezed_for_img.clone();
            isExistLeft = true;
        }
        else
        {
            for (int j = 0; j < squeezed_for_bone.size[0]; j++)
            {
                squeezed_for_bone.at<float>(j, 0) = (squeezed_for_origin.at<float>(j, 1) - squeezed_for_origin.at<float>(0, 1)) * skeletonXRatio * 2;
                squeezed_for_bone.at<float>(j, 1) = (squeezed_for_origin.at<float>(j, 0) - 0.5) * skeletonYRatio * 2;
                squeezed_for_bone.at<float>(j, 2) = squeezed_for_origin.at<float>(j, 2) * skeletonYRatio * 3;
                //UE_LOG(LogTemp, Log, TEXT("squeezed_for_bone %d : %f, %f, %f"), j, squeezed_for_bone.at<float>(j, 1), squeezed_for_bone.at<float>(j, 2), squeezed_for_bone.at<float>(j, 3));
            }

            handRight = squeezed_for_bone.clone();
            handRightImg = squeezed_for_img.clone();
            isExistRight = true;
        }
        ....

 

 

 

 

게임모드 헤더

	UPROPERTY(BlueprintReadWrite, Category = "HandDetected")
	bool isExistLeft;
	UPROPERTY(BlueprintReadWrite, Category = "HandDetected")
	bool isExistRight;

	void check_hand_exist(std::vector<cv::Mat>& imgs_landmarks);

게임모드 구현

 

void ADesktopGameModeBase::ReadFrame()
{
	if (!capture.isOpened())
	{
		return;
	}
	capture.read(webcamImage);

	/*
	get filtered detections
	*/
	blaze.ResizeAndPad(webcamImage, img256, img128, scale, pad);
	//UE_LOG(LogTemp, Log, TEXT("scale value: %f, pad value: (%f, %f)"), scale, pad[0], pad[1]);
	std::vector<Blaze::PalmDetection> normDets = blaze.PredictPalmDetections(img128);
	std::vector<Blaze::PalmDetection> denormDets = blaze.DenormalizePalmDetections(normDets, webcamWidth, webcamHeight, pad);
	std::vector<Blaze::PalmDetection> filteredDets = blaze.FilteringDets(denormDets, webcamWidth, webcamHeight);





	std::vector<cv::Rect> handRects = blaze.convertHandRects(filteredDets);
	std::vector<cv::Mat> handImgs;
	blaze.GetHandImages(webcamImage, handRects, handImgs);
	std::vector<cv::Mat> imgs_landmarks = blaze.PredictHandDetections(handImgs);
	std::vector<cv::Mat> denorm_imgs_landmarks = blaze.DenormalizeHandLandmarksForBoneLocation(imgs_landmarks, handRects);

	check_hand_exist(imgs_landmarks);

 

void ADesktopGameModeBase::check_hand_exist(std::vector<cv::Mat>& imgs_landmarks)
{
	if (imgs_landmarks.size() == 0)
	{
		isExistLeft = false;
		isExistRight = false;
	}
	else
	{
		isExistLeft = blaze.isExistLeft;
		isExistRight = blaze.isExistRight;
	}
}

 

 

 

두손이 존재하고,

두손의 엄지검지가 가까울때 찾기

 

 

추론 결과 손을 놓칠때가 있어 아쉽긴하지만 

일단 동작은가능

 

 

 

 

 

일단 여기까지 했으니

줌인 줌아웃 부터 해보자

 

두손을 밖으로 밀면 줌인

두손을 안으로 밀면 줌아웃

 

 

 

어캐 구현할까 고민되는게

컴포넌트계로 가져오면 두 손사이 거리가 안되서

월드계 가져오긴해야하는데

 

단순 y거리로 하자니 회전된 상태때문에 고민이된다.

 

 

그래서 월드계 위치 가져와서

 

두손 엄지

줌인아웃의 경우 z를 제외한 xy축값만으로 거리 계산

회전의 경우 xy를 제외한 z축 값만으로 거리 계산하면 될듯

 

 

변수로

현재붙음, 이전붙음

현재xy거리, 시작시점xy거리

현재xy거리, 시작시점z거리

 

추가

 

 

두손 존재여부확인과

 

두손가락 붙음여부 확인 

 

 

양손다 두손가락 붙으면

 

엄지검지간 거리 설정

xy, z거리

 

 

떨어졌다가붙을때 시작 거리설정

계속 붙어있을때 줌, 회전 여부 판단

 

 

xy거리가 늘면 줌인, 줄면 줌아웃

 

오른손 왼손엄지 z 큰것 찾아 좌회전우회전판단

 

 

손 놓치면서 오동작 하긴하는데 대충 되긴한다.

 

+ Recent posts