브라우저를 통해 소켓 통신을 하게 되면 다음과 같은 동작들이 일어나게 되는데, 

 

다음의 각 부분을 상세히 기록해보려고 한다.

 

아래 이미지도 나중에 바뀔 예정임

 

일단 허접하게라도 적어놔야 시작할 것 같아서....

 

 

 

윈도우 이벤트 구현을 WaitForSingleObject 나 WaitForMultipleObjects를 이용해서 구현하다가

 

리눅스에서 구현하기 위해서 이래저래 알아보다 구현 방법정리함.

 

 

1. 변수 선언

std::condition_variable trigger_event;
std::mutex              trigger_mutex;
int                     trigger_type = 0;
int                     trigger_state = 0;

 

2. 트리거 기다리는 부분

while(1){
    std::unique_lock<std::mutex> lk(trigger_mutex);
    if (trigger_event.wait_for(lk, 500ms, [] {
        return trigger_state == 1; })
    )
{
    trigger_state = 0;
    switch(trigger_type){
        case 0:
            break;
        case 1:
            break;
    }
}

 

3. 트리거 발생 부분

trigger_state = 1;
trigger_event.notify_one();

 

 

 

 

미국 출장을 가야 하는 건 알고 있었지만, 날짜가 확정되지 않아 마음을 놓고 있던 터에

 

 갑자기 출장을 오라는 통보를 받아서

 

다른 건 준비하면 되는데, 출국 72시간 안에 코로나 검사를 받아서

 

영문 음성 증명서를 받아야 출국이 가능하다는데,

 

화요일  18시 40분 비행기라서, 가능한 시간이 토요일 18시 40분 부터였다.

 

그런데, 부산인데다가 토요일 그시간에는 검사를 해주는 곳이 없고,

 

일요일도 검사는 간간이 하는데, 영문 음성 증명서를 발급해 주는 곳은 없었다.

 

그래서 이래저래 알아보다가 찾은 후보들을 기록해놓고자 이 글을 남긴다.

 

1. 해운대 백병원

 

" rel="noopener" data-mce-href="http://">http://

 - 집에서 가깝고 1일만에 나와서 처음에는 여기서 검사를 하려고 했으나, 

 

  월요일에 검사하고, 화요일 오전에 영문 결과지를 받아서 가야 하는데,

 

  김해공항 가는길이 지체되면 큰일 나기 때문에

 

  최악의 경우 오후에 검사 결과가 나올수도 있다는 말에 다른 대안을 찾음

 

  검사를 하고 나서 영문 증명서 발급도 번호표 뽑고 기다리고 이런 절차가 오전에 시간을 지체할 수 있어

 

  지금 보니 이렇게 하지 않아서 다행이었다고 생각하는데 잘 모르겠음

 

 

 

2. 보훈 병원

" rel="noopener" data-mce-href="http://">http://

 

웹으로 검사 받은 사람들의 평을 검색해보니, 결과도 빨리 나온다고 하고, 김해공항 가는 길이라 여기를 후보지로 결정했었음. 단점은 주차가 힘들다고 하는데, 나는 택시타고 갈 예정이어서 별 문제는 안되겠다 싶었음 

 

 

2. 부산 의료원

" rel="noopener" data-mce-href="http://">http://

 

최종적으로 여기서 했는데, 

이유는 일요일에도 검사가 가능하고, 월요일에 증명서를 받으러 가면 되서 

출발 당일 안 서둘러도 된다는 이유에서이다.

하지만, 월요일 증명서 받으러 가니 사람이 바글바글 함. -_-;

증명서 받는데 생각보다 오래 걸렸음

 

'기타' 카테고리의 다른 글

소켓통신 원리(1)  (0) 2021.10.22
Linux C++ 이벤트  (0) 2021.10.06
키보드 후킹을 이용한 바코드 읽기  (0) 2021.05.07
자동차 번호판 학습하기  (1) 2021.04.19
jetson board Performance  (0) 2021.03.25

급조해서 구글링 한 뒤 짠거라 코드가 허접하다..-_-;

정리도 안되어 있다. 그래도 돌아간다.

나중에 정리해야히 하면서 정리 안할듯...

 

    public class KeyboardHook
    {
        public struct BarCodes
        {
            public int VirtKey;     //Virtual Code  
            public int ScanCode;    //Scan Code  
            public string KeyName;  //Key Name  
            public uint AscII;      //AscII  
            public char Chr;        //character  

            public string BarCode;  //Bar code information  
            public bool IsValid;    //Is the bar code valid  
            public DateTime Time;   //Scan time  
        }

        private struct EventMsg
        {
            public int message;
            public int paramL;
            public int paramH;
            public int Time;
            public int hwnd;
        }

        static BarCodes barCode = new BarCodes();

        public delegate void ProcessCode(string code);
        public static ProcessCode ProcCode;

        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);

        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

        [DllImport("user32.dll")]
        static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);

        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);

        [DllImport("user32.dll")]
        static extern uint MapVirtualKey(uint uCode, uint uMapType);

        [DllImport("user32", EntryPoint = "GetKeyNameText")]
        private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize);

        [DllImport("user32", EntryPoint = "GetKeyboardState")]
        private static extern int GetKeyboardState(byte[] pbKeyState);

        [DllImport("user32", EntryPoint = "ToAscii")]
        private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);


        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
        
        
        const int WH_KEYBOARD_LL = 13;
        const int WM_KEYDOWN     = 0x100;

        private static LowLevelKeyboardProc _proc = hookProc;
        private static IntPtr hhook = IntPtr.Zero;
        static string strBarCode = "";

        public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            if(code == 0)
            {
                EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));

                if(wParam == (IntPtr)WM_KEYDOWN)
                {
                    barCode.VirtKey  = msg.message & 0xff;  //Virtual Code
                    barCode.ScanCode = msg.paramL & 0xff;   //Scan Code


                    
                    uint nonVirtualKey = MapVirtualKey((byte)barCode.VirtKey, 2);
                    if (nonVirtualKey != 0)
                    {
                        barCode.Chr = Convert.ToChar(nonVirtualKey);
                        if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 50)
                        {
                            strBarCode = barCode.Chr.ToString();
                        }
                        else
                        {
                            if ((msg.message & 0xff) == 13 && strBarCode.Length > 3)  //Enter  
                            {
                                barCode.BarCode = strBarCode;
                                barCode.IsValid = true;

                                ProcCode?.Invoke(strBarCode);
                            }
                            strBarCode += barCode.Chr.ToString();
                        }

                        barCode.Time = DateTime.Now;
                        barCode.IsValid = false;
                    }
                    
                }
            }
            //
            return CallNextHookEx(hhook, code, (int)wParam, lParam);
        }
        
        public static void SetHook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
        }

        public static void UnHook()
        {
            UnhookWindowsHookEx(hhook);
        }
    }

 

실제로 갖다 쓸때는 다음과 같이 하면 된다

//1. Form_Load같은 초기화 코드
KeyboardHook.SetHook();
KeyboardHook.ProcCode += ProcessCode;

//2. Form_Closing시
KeyboardHook.UnHook();

//3. 바코드가 읽어지면 호출되는 함수
private void ProcessCode(string code)
{
	this.Invoke(new MethodInvoker(delegate ()
	{
		MessageBox.Show(code);
	}));

}

 

'기타' 카테고리의 다른 글

Linux C++ 이벤트  (0) 2021.10.06
(부산)해외 출국을 위한 영문 코로나 음성 검사 증명서  (0) 2021.07.30
자동차 번호판 학습하기  (1) 2021.04.19
jetson board Performance  (0) 2021.03.25
Jetson Xavier boot from SSD  (0) 2021.03.24

 자동차 번호판 관련 자료를 검색하다가 Tesseract를 알게 되고,

 

이놈을 학습하기 위한 도구가  jTessBoxEditor를 알게되어서 정리하고자 함

 

1.  JRE(jdk 런타임) 설치 안되어 있으면 설치해야 함

https://java.com/ko/download/ie_manual.jsp?locale=ko

 

2. github에서 jTessBoxEditor 다운로드

git clone https://github.com/nguyenq/jTessBoxEditorFX

 

3. 다운로드된 위치로 이동해서 train.bat 실행

 

4. 다음과 같은 창이 나타난다.

 

5. 작업할 폴더를 만든다. (여기서는 D:\Document\Tesseract\Train\Run4 폴더)

   그 후에 이미지를 방금 생성한 폴더로 복사한다.

 

6. Box Editor 탭으로 이동해서  Open > 숫자값이 적혀있는 이미지 Open > 확인

7. 다시 Trainer 탭으로 이동해서 상단의 정보를 다음과 같이 변경

  - Training Data  폴더를 방금 생성했던 폴더(D:\Document\Tesseract\Train\Run4)로 변경 

  - Language : KOR

  - 우측의 콤보에서 Make Box File을 선택한다

 

8. 다시 Box Editor 탭으로 가서 Open 버튼을 눌러서 이미지를 다시 열게 되면, 다음과 같이 임의의 사각형들이 보인다

9. 왼쪽의 그리드에서 선택해도 되고, 우측의 텍스트를 선택해도 사각형이 선택되는데, 상단의 숫자값을 조정하여 사각형의 위치와 크기를 조정할 수 있다.

  - 아직 많이 해보지는 않았지만, 되도록 많은 값이 있으면 좋지 않을까 싶다

  - 작업을 마치면 꼭 저장 버튼을 눌러서 저장해줘야 한다.

10. 조정이 끝났으면 다시 Trainer  탭으로 이동해서 콤보에서 [Train with Existing Box] 항목 선택 후 Run 버튼을 눌러서 학습한다.

11. 학습이 끝나면 Validate 버튼을 눌러서 임의의 이미지를 선택해서 학습한 결과를 테스트 해 본다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sudo -H pip install -U jetson-stats

sudo jtop

www.youtube.com/watch?v=ZK5FYhoJqIg

 

* SSD Device

in video : /dev/nvme0n1p1

my device : /dev/sda1

 

* ~/rootOnNVMe/copy-rootfs-ssd.sh

 > Line 3 : sudo mount /dev/nvme0n1p1 /mnt  => sudo mount /dev/sda1 /mnt 

* ~/rootOnNVMe/data/setssdroot.sh

 >  Line 3 : NVME_DRIVE="/dev/nvme0n1p1" => NVME_DRIVE="/dev/sda1"

 

 

* ~/rootOnNVMe/data/

 > Line 8 : ConditionPathExists=/dev/nvme0n1p1 => ConditionPathExists=/dev/sda1

 

 

 

 

 

'기타' 카테고리의 다른 글

자동차 번호판 학습하기  (1) 2021.04.19
jetson board Performance  (0) 2021.03.25
내 컴퓨터 바이트 오더 확인하기  (0) 2021.03.05
C# Bitmap객체를 8bit gray로 byte array에 담기  (0) 2021.02.05
Jetson TX2(5)  (0) 2020.05.27
//리턴 값
//Little Endian : true
//Big Endian : false

private bool NetworkByteOrderChecker()
{
    ushort[] testUVal = { 0x1234 };
    byte[]   testBVal = new byte[2];
    Buffer.BlockCopy(testUVal, 0, testBVal, 0, 2);

    if (testBVal[0] == 0x34)
        return true;
        
    return false;
}

내 컴퓨터의 바이트 오더를 확인하기 위한 코드

 

네트워크 바이트(빅 엔디안)로 보내기 위해서는 뒤집어야 하나 말아야 하나 flag를 저장하기 위한 함수

 

 

'기타' 카테고리의 다른 글

jetson board Performance  (0) 2021.03.25
Jetson Xavier boot from SSD  (0) 2021.03.24
C# Bitmap객체를 8bit gray로 byte array에 담기  (0) 2021.02.05
Jetson TX2(5)  (0) 2020.05.27
Jetson TX2(4) - Tensorflow install  (0) 2020.05.27

맞는지 검증은 차차하기로...-_-;

 

 

 

        public static byte[] ToGrayscale(Bitmap bmp)
        {

            int bpp = Image.GetPixelFormatSize(bmp.PixelFormat) / 8;

            BitmapData src_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);

            byte[] src_bytes = new byte[src_data.Stride * src_data.Height];
            Marshal.Copy(src_data.Scan0, src_bytes, 0, src_bytes.Length);
            // Copy the bytes from the image into a byte array
            byte[] dst_bytes = new byte[bmp.Height * bmp.Width];

            for(int i=0; i<dst_bytes.Length; ++i)
                dst_bytes[i] = (byte)((src_bytes[i * bpp + 0] + src_bytes[i * bpp + 1] + src_bytes[i * bpp + 2]) / 3);

            bmp.UnlockBits(src_data);
#if DEBUG
/*
            Bitmap result = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format8bppIndexed);
            BitmapData dst_data = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            Marshal.Copy(dst_bytes, 0, dst_data.Scan0, dst_bytes.Length);
            result.UnlockBits(dst_data);
            ColorPalette Palette = result.Palette;
            for (int i = 0; i < Palette.Entries.Length; ++i)
            {
                Palette.Entries[i] = Color.FromArgb(i, i, i);
            }
            result.Palette = Palette;

            result.Save("dst.jpg");
//*/
#endif


            return dst_bytes;
        }

'기타' 카테고리의 다른 글

Jetson Xavier boot from SSD  (0) 2021.03.24
내 컴퓨터 바이트 오더 확인하기  (0) 2021.03.05
Jetson TX2(5)  (0) 2020.05.27
Jetson TX2(4) - Tensorflow install  (0) 2020.05.27
Jetson TX2 설정(3)  (0) 2020.05.27

+ Recent posts