개발 관련/프로젝트

Unity에서 사물인식을 위한 테스트 next

소서리스25 2023. 10. 21. 17:09
반응형

지금까지는 Unity의 barracuda 추론학습을 이용한 방법의 가능성을 살펴봤다. 결론은 현재 내가 가진 환경에서 1차적으로는 가능하다는 것이다. 

 

다음으로 음성인식을 진행하고자 하였으나 아직 한 가지 테스트가 더 남았다. 초반에 언급했던 방식 중 두 번째인 방식으로 ImageSearch를 이용한 방법이다.

 

그전에 지난번 가로에서 작동이 안되었던 이유는 이미지 처리시 회전값이 -90로 되어 있어서 문제가 발생된 것이다.

이를 수정하니 가로 모드에서도 제대로 작동하였다.

 

그럼 수정도 했으니 일단 보류하고 다음의 추가적인 인식을 진행해 본다.

ImageSearch를 이용한 방법은 이미 오래전부터 Autoit을 이용하여 진행해 왔다. PC화면에서의 이미지 찾기나 웹캠을 이용한 이미지 찾기 등에 주로 사용해 왔다. 퍼포먼스는 떨어지기 때문에 높은 해상도와 실시간 동영상에서는 부적합하다고 생각한다. 

그러나 뭐 예전보다는 PC사양도 좋아졌으니까 해상도를 높여서 해도 좋지 않을까 한다.

다만, 문제는 작동 환경이 Android라는 것이라서 우선 이것부터 되는지 확인해야 한다. 저거 자체가 Window에 적합한데 혹시나 해서... 기본적으로 dll 파일은 Android에서 안 돌아간다고 알고 있다.. jar 파일로 변형해서 넣어줘야 한다고 한다. 물론 가능할 경우일 때만..

 

그래도 어쨌든... 안되는 거 알지만 확인은 해 보았다.

 

당연한 거라 생각했지만 역시나 아무런 반응이 없다.

 

Android Studio로 logcat을 찍어보니 다음과 같이 나온다.

1
2
3
4
5
6
7
2023-10-19 19:34:08.631 5938-6007/? E/Unity: Unable to find ImageSearch_x64
2023-10-19 19:34:08.645 5938-6007/? E/Unity: DllNotFoundException: Unable to load DLL 'ImageSearch_x64': The specified module could not be found.
      at WebCamView.ImageSearch (System.Int32 x, System.Int32 y, System.Int32 right, System.Int32 bottom, System.String imagePath) [0x00000] in <00000000000000000000000000000000>:0 
      at WebCamView.UseImageSearch (System.String imgPath, System.String tolerance) [0x00000] in <00000000000000000000000000000000>:0 
      at WebCamView.Start () [0x00000] in <00000000000000000000000000000000>:0 
     
    (Filename: currently not available on il2cpp Line: -1)
cs

 

그렇다. 아예 인식을 못한다. 그러니 당연히 쓸 수 없다.

 

아래 코드를 활용하면 유니티에서도 Imagesearch를 사용할 수 있다. Autoit이나 AutoHotKey 말고도 Unity에서 충분히 활용할 수 있다. Webcam을 이용한 동영상은 아직 시도 안 해봐서 퍼포먼스가 잘 나오는지는 모르겠다. 나중에 시간 되면 도전해 보겠다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
 
public class WebCamView : MonoBehaviour
{
    [DllImport("ImageSearch_x64")]
    public static extern IntPtr ImageSearch(int x, int y, int right, int bottom, [MarshalAs(UnmanagedType.LPStr)]string imagePath);
 
    public string _imagePath = ""// 찾고자 하는 이미지의 파일명
 
    public Text txt; // 화면상의 위치인식 확인용
 
    void Start()
    {
        Screen.SetResolution(1280720true); 
 
        string[] results = UseImageSearch(_imagePath, "100");
 
        if (results == null)
        {
            Debug.Log("Image not found~");
            txt.text = "Image not found~";
        }
        else
        {
            Debug.Log("Find image : " + results[1+ " : " + results[2]);
            txt.text = "Find image : " + results[1+ " : " + results[2];
        }
    }
 
 
    public static string[] UseImageSearch(string imgPath, string tolerance)
    {
        imgPath = "*" + tolerance + " " + "./Assets/Resources/" + imgPath;
 
        IntPtr result = ImageSearch(00, Screen.width, Screen.height, imgPath);
 
        string res = Marshal.PtrToStringAnsi(result);
 
        if (res[0== '0'return null;
 
        string[] data = res.Split('|');
 
        int x; int y;
        int.TryParse(data[1], out x);
        int.TryParse(data[2], out y);
 
        return data;
    }
}
cs

 

그래도 작은 용도로 사용한다면 아두이노 기능을 갖춘 라떼판다와 같은 미니 PC에서 활용될 수 있겠다.

 

자, 그러면 다음 단계로 음성인식에 대해 연구해 볼 예정이다.

사물인식의 보완은 어차피 다른 것들과 합쳐야 해서 진행과정에서 조금씩 보완할 예정이다.

 

반응형