コード例 #1
0
        void PanoImgInfoToTopBottomDeg(PanoramaInfo panoimginfo, ref double dTopDeg, ref double dBottomDeg)
        {
            dTopDeg     = dBottomDeg = panoimginfo.dPanoImgFovH / 2;
            dBottomDeg *= -1;

            dTopDeg    += panoimginfo.dPanoImgTiltPivotDeg;
            dBottomDeg += panoimginfo.dPanoImgTiltPivotDeg;
        }
コード例 #2
0
        public void SetChInfo(int nCh, PanoramaInfo info, MainWindow mainWndPrt)
        {
            m_nCh           = nCh;
            this.mainWndPtr = mainWndPrt;
            panoSetupWindow.SetChinfo(nCh, info, mainWndPtr);

            panoSetupWindow.Topmost = true;
        }
コード例 #3
0
        public PanoramaMoveInfo[] CalcPanoramaPanPostion(PanoramaInfo info)
        {
            //m_list.clear();
            int nFrameDeg = 24;//한프레임당 30도

            //int iTotalFrame = 360 / m_nLGTD_PerFrame;
            int iTotalFrame = info.nPanoImgFovW / nFrameDeg;

            PanoramaMoveInfo[] arrMoveInfo = new PanoramaMoveInfo[iTotalFrame];

            //CString str; str.Format("%d 장", iTotalFrame);
            //GetDlgItem(IDC_STATIC_SET_NUMOFFRAME)->SetWindowText(str);
            //((CSliderCtrl*)GetDlgItem(IDC_SLIDER1))->SetRange(0, iTotalFrame);
            double dCapturePanDeg = nFrameDeg / 2.0;

            //dCapturePanDeg += 5;//  [4/11/2014 Yeun]

            //PRESETDATA presetdata;
            //presetdata.panoinfo.uPanoImgFovW = 360;//파노라마 가로 전체 각도
            //presetdata.panoinfo.dPanoImgFovH = m_nLGTD_PerFrame * 0.8;//임시
            //presetdata.panoinfo.dPanoImgTiltPivotDeg = theApp.m_dTiltDeg;

            //presetdata.bPanoCap = TRUE;

            //  [5/9/2014 Yeun]
            //double dPanoImgStartPan = (m_nLGTD_PerFrame - dCapturePanDeg) / 2;

            //CString strSetPan;
            for (int i = 0; i < iTotalFrame; i++)
            {
                PanoramaMoveInfo moveInfo = new PanoramaMoveInfo();
                moveInfo.dPan  = dCapturePanDeg;
                moveInfo.dTilt = info.dPanoImgTiltPivotDeg;

                arrMoveInfo[i] = moveInfo;

                //CString strPan;
                //strPan.Format("%05.1lf, ", dCapturePanDeg);
                //strSetPan += strPan;
                // presetdata.dPanAbsV = dCapturePanDeg;
                //presetdata.dTiltAbsV = theApp.m_dTiltDeg;

                // presetdata.panoinfo.dPanoImgStartPan = dPanoImgStartPan;//  [5/9/2014 Yeun]
                // m_list.push_back(presetdata);

                dCapturePanDeg += nFrameDeg;
            }
            return(arrMoveInfo);
        }
コード例 #4
0
        public void SetChinfo(int nCh, PanoramaInfo info, MainWindow mainWndPtr)
        {
            m_nCh           = nCh;
            this.mainWndPtr = mainWndPtr;

            ChannelStatusLabel.Content = String.Format("채널 {0:d2}", nCh);

            string strFovHeight = String.Format("{0:00.0}", info.dPanoImgFovH);

            this.PanoImageFovHeightTextBox.Text = strFovHeight;

            string strTilt = String.Format("{0:+00.0000;-00.0000;+00.0000}", info.dPanoImgTiltPivotDeg);

            this.PanoImageTiltDegTextBox.Text = strTilt;

            this.ZoomAbsTextBox.Text = info.nPanoCaptureZoomAbs.ToString();
        }
コード例 #5
0
        private void PanoramaCaptureStart_Click(object sender, RoutedEventArgs e)
        {
            PanoramaInfo info = new PanoramaInfo();

            try
            {
                info.dPanoImgFovH         = double.Parse(this.PanoImageFovHeightTextBox.Text);
                info.nPanoCaptureZoomAbs  = int.Parse(this.ZoomAbsTextBox.Text);
                info.dPanoImgTiltPivotDeg = double.Parse(PanoImageTiltDegTextBox.Text);
            }
            catch (Exception eee)
            {
                MessageBox.Show("입력된 값이 잘못되었습니다.");
                return;
            }

            mainWndPtr.PanoramaCaptureStart(m_nCh, info);
        }
コード例 #6
0
        public void PanoramaCaptureStart(int nCh, PanoramaInfo panoInfo)
        {
            //이동
            if (CheckPresetRunStatus(nCh) == true)//이미 진행 중
            {
                return;
            }

            string status = String.Format("채널 {0} 프리셋 시작", nCh);

            //this.PresetStatusLabel.Content = status;
            //this.m_bPresetStart[nCh - 1] = true;



            //ImgPosToPanTiltPos(x, y, ref panAbs, ref tiltAbs, arrPanoInfo[nCh - 1]);
            PanoramaMoveInfo[] moveInfo = CalcPanoramaPanPostion(panoInfo);


            DestroyPacketParsingThread(nCh);//종료 시도
            for (int i = 0; i < 50; i++)
            {
                if (IsRunPacketParsingThread(nCh) == false)//종료되었는지 확인
                {
                    //패킷 파싱 스레드 종료
                    //이제 부터 동기적으로 송수신
                    break;
                }
                Thread.Sleep(100);
            }
            #region

            PanoramaCanvas[] arrCanvas = { panoramaCanvas1, panoramaCanvas2, panoramaCanvas3, panoramaCanvas4, panoramaCanvas5 };

            Task.Run(() =>
            {
                SetPresetRunStatus(nCh, true);
                const int nTimeOut     = 10;
                int nCount             = 0;
                int nTimeStamp         = 1;
                string strPresetStatus = "";

                while (true)
                {
                    for (int i = 0; i < moveInfo.Count(); i++)//12장 촬영
                    {
                        nTimeStamp = 0;
                        //선택이동 스레드
                        double panAbs  = moveInfo[i].dPan;
                        double tiltAbs = moveInfo[i].dTilt;
                        int zoom       = moveInfo[i].nZoomAbs;
                        int focus      = 50000;


                        string strPTZF = String.Format("001;{0:000.####};{1:+00.####;-00.####;+00.0000 };{2:00000};{3:00000}", panAbs, tiltAbs, zoom, focus);
                        arrCanvas[nCh - 1].panoSetupWindow.SetPanoramaStatus(strPTZF);
                        SendAuthorityCmd(nCh, CommandPTZFAbsMove.CMDGROUP_PTZFABSMOVE, CommandPTZFAbsMove.CMDTYPE_PTZFABSMOVE_MOVE, strPTZF);

                        Thread.Sleep(1000);

                        while (true)//상태확인
                        {
                            SendAuthorityCmd(nCh, CommandPTZReqResp.CMDGROUP_PTZREQ, CommandPTZReqResp.CMDTYPE_PTZREQ_PAN_MOTORSTATUS_REQ);
                            string strStatus = GetPanMoveStatus(nCh);

                            if (strStatus == "1")
                            {
                                nCount = 0;
                                //System.Console.WriteLine("프리셋 이동중...");
                                strPresetStatus = String.Format("채널 {0} 파노라마 프레임{1} 이동중({2})", nCh, i + 1, nTimeStamp);
                            }
                            else if (strStatus == "2")
                            {
                                nCount = 0;
                                //System.Console.WriteLine("프리셋 이동 완료...");
                                strPresetStatus = String.Format("채널 {0} 파노라마 프레임{1} 이동 정지({2})", nCh, i + 1, nTimeStamp);
                                break;
                            }
                            else
                            {
                                strPresetStatus = String.Format("채널 {0} 파노라마 프레임{1} 상태 인식 실패({2})", nCh, i + 1, nTimeStamp);
                            }

                            arrCanvas[nCh - 1].panoSetupWindow.SetPanoramaStatus(strPresetStatus);
                            //SetPresetStatus(nCh, strPresetStatus);

                            SendAuthorityCmd(nCh, CommandPTZReqResp.CMDGROUP_PTZREQ, CommandPTZReqResp.CMDTYPE_PTZREQ_PANTILT_POS_REQ);
                            Thread.Sleep(1000);

                            nCount++;
                            nTimeStamp++;
                            if (nCount >= nTimeOut)
                            {
                                break;
                            }
                        }

                        //캡처.

                        string imgName         = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + i.ToString() + ".jpg";
                        string baseDir         = AppDomain.CurrentDomain.BaseDirectory;
                        string chFolder        = String.Format("Ch{0:d2}\\", nCh);
                        string strFilePathName = baseDir + chFolder + imgName;
                        Process[] procByName   = Process.GetProcessesByName("Hawkeye_VideoPlayer");

                        if (procByName.Length > 0)
                        {
                            string msg  = strFilePathName;
                            byte[] buff = System.Text.Encoding.Default.GetBytes(msg);

                            Win32API.COPYDATASTRUCT cds = new Win32API.COPYDATASTRUCT();
                            cds.dwData = (IntPtr)nCh;
                            cds.cbData = buff.Length + 1;
                            cds.lpData = msg;

                            for (int j = 0; j < procByName.Length; j++)
                            {
                                Win32API.SendMessage(procByName[j].MainWindowHandle, Win32API.WM_COPYDATA, 0, ref cds);
                            }
                        }
                        Thread.Sleep(1000);
                        if (File.Exists(strFilePathName) == true)//파일이 존재
                        {
                            Console.WriteLine("파일이 존재합니다.");
                            arrCanvas[nCh - 1].SetImagePathName(i, strFilePathName);
                            strPresetStatus = String.Format("채널 {0} 파노라마 프레임{1} 캡처 성공", nCh, i + 1);

                            panoInfoIni.ReadIni(nCh);
                            panoInfoIni.arrPanoImagePathName[i] = strFilePathName;
                            panoInfoIni.WriteIni(nCh);
                        }
                        else
                        {
                            Console.WriteLine("파일을 찾을수없습니다.");
                            strPresetStatus = String.Format("채널 {0} 파노라마 프레임{1} 캡처 실패", nCh, i + 1);
                        }
                        arrCanvas[nCh - 1].panoSetupWindow.SetPanoramaStatus(strPresetStatus);
                    }

                    //

                    //Thread.Sleep(1000);
                    //SendAuthorityCmd(nCh, CommandPTZReqResp.CMDGROUP_PTZREQ, CommandPTZReqResp.CMDTYPE_PTZREQ_PAN_MOTORSTATUS_REQ);
                    //string strMotorStatus = GetPanMotorStatus();
                    //UpdatePanMotorStatusUI(nCh, strMotorStatus, true);
                    break;
                }
                SendAuthorityCmd(nCh, CommandPTZReqResp.CMDGROUP_PTZREQ, CommandPTZReqResp.CMDTYPE_PTZREQ_PANTILT_POS_REQ);
                strPresetStatus = String.Format("채널 {0} 파노라마 촬영 완료({1})", nCh, nTimeStamp);
                arrCanvas[nCh - 1].panoSetupWindow.SetPanoramaStatus(strPresetStatus);
                //SetPresetStatus(nCh, strPresetStatus);
                //this.m_bPresetStart[nCh - 1] = false;
                SetPresetRunStatus(nCh, false);
                CreatePacketParsingThread(nCh);
            });
            #endregion
        }
コード例 #7
0
        public MainWindow()
        {
            InitializeComponent();

            winInfoIni.ReadIni();

            PanoramaCanvas[] arrCanvas        = { panoramaCanvas1, panoramaCanvas2, panoramaCanvas3, panoramaCanvas4, panoramaCanvas5 };
            PanBeltCanvas[]  arrPanBeltCanvas = { panBeltCanvas1, panBeltCanvas2, panBeltCanvas3, panBeltCanvas4, panBeltCanvas5 };

            for (int i = 0; i < MAX_CHANNEL; i++)
            {
                panoInfoIni.ReadIni(i + 1);

                // string imgName = "20170408141214.jpg";
                //string baseDir = AppDomain.CurrentDomain.BaseDirectory;

                arrPanoInfo[i] = new PanoramaInfo();
                arrPanoInfo[i].nPanoImgFovW         = panoInfoIni.nPanoImgFovW;
                arrPanoInfo[i].dPanoImgFovH         = panoInfoIni.dPanoImgFovH;
                arrPanoInfo[i].dPanoImgTiltPivotDeg = panoInfoIni.dPanoImgTiltPivotDeg;
                arrPanoInfo[i].nPanoCaptureZoomAbs  = panoInfoIni.nPanoCaptureZoomAbs;
                for (int k = 0; k < 15; k++)
                {
                    //panoInfoIni.arrPanoImagePathName[k] = baseDir + imgName;
                    arrCanvas[i].SetImagePathName(k, panoInfoIni.arrPanoImagePathName[k]);
                }
                //////////////////////////////////
                //팬 벨트 보정값
                systemPTZEnvSetup.ReadIni(i + 1);
                double dPanOffset = double.Parse(systemPTZEnvSetup.azimuth);
                arrPanBeltCanvas[i].SetPanOffset(dPanOffset);

                SetAreaName(i + 1, systemPTZEnvSetup.area);

                //panoInfoIni.WriteIni(i+1);
            }

            udpSock.CreateUDPSocket();
            for (int i = 0; i < MAX_CHANNEL; i++)
            {
                CreatePacketParsingThread(i + 1);
            }

            Minimize();



            m_panoCanvasWidth  = panoramaCanvas1.Width;
            m_panoCanvasHeight = panoramaCanvas1.Height;



            panoramaCanvas1.SetChInfo(1, arrPanoInfo[0], this);
            panoramaCanvas1.MouseLeftButtonUp += (sender, e) =>
            {
                System.Console.WriteLine("MainWindow MouseLeftButtonUp");
            };


            panoramaCanvas2.SetChInfo(2, arrPanoInfo[1], this);
            panoramaCanvas2.MouseLeftButtonUp += (sender, e) =>
            {
                System.Console.WriteLine("MainWindow MouseLeftButtonUp");
            };


            panoramaCanvas3.SetChInfo(3, arrPanoInfo[2], this);
            panoramaCanvas3.MouseLeftButtonUp += (sender, e) =>
            {
                System.Console.WriteLine("MainWindow MouseLeftButtonUp");
            };


            panoramaCanvas4.SetChInfo(4, arrPanoInfo[3], this);
            panoramaCanvas4.MouseLeftButtonUp += (sender, e) =>
            {
                System.Console.WriteLine("MainWindow MouseLeftButtonUp");
            };


            panoramaCanvas5.SetChInfo(5, arrPanoInfo[4], this);
            panoramaCanvas5.MouseLeftButtonUp += (sender, e) =>
            {
                System.Console.WriteLine("MainWindow MouseLeftButtonUp");
            };



            //BitmapImage bmp = new BitmapImage( new Uri("20170408141214.jpg") );
            //WriteableBitmap
            //Image img;
            //Bitmap 은 Abstract Image 클래스 에서 상속받습니다.

            /*
             * string imgName = "20170408141214.jpg";
             * string baseDir = AppDomain.CurrentDomain.BaseDirectory;
             * Image img = new Image();
             * img.ur
             * BitmapSource bmpSrc = new BitmapSource();
             *
             * WriteableBitmap maskBmp = new WriteableBitmap(bmpSrc);
             */



            // panoramaCanvas.ren

            //DrawingImage MyDrawingImage = new DrawingImage(MyDrawing);
        }
コード例 #8
0
        private void PanTiltPosToImgAbsPos(double dPan, double dTilt, ref int X, ref int Y, PanoramaInfo panoimginfo)//팬틸트 값 -> 이미지 절대 좌표
        {
            //이미지Pan의 총 각도(360˚) : 이미지총가로픽셀 = dPan : ?
            X = (int)(m_panoCanvasWidth * dPan / panoimginfo.nPanoImgFovW);

            double dPanoImgTopDeg = 0.0, dPanoImgBottomDeg = 0.0;

            PanoImgInfoToTopBottomDeg(panoimginfo, ref dPanoImgTopDeg, ref dPanoImgBottomDeg);

            //세로이미지의전체각도 구하기
            double dPanoImgFovH = panoimginfo.dPanoImgFovH;

            //이미지Tilt의 총 각도 : 이미지총세로픽셀 = dTilt : ?
            Y = (int)(m_panoCanvasHeight * dTilt / dPanoImgFovH);

            //수평각도구하기
            double dTiltHorizon = dPanoImgFovH + dPanoImgBottomDeg;

            //이미지Tilt의 총 각도 : 이미지총세로픽셀 = dTiltHorizon : ?
            int iHorizonPxY = (int)(m_panoCanvasHeight * dTiltHorizon / dPanoImgFovH);

            //보정
            Y = iHorizonPxY - Y;
        }
コード例 #9
0
        private void ImgPosToPanTiltPos(int x, int y, ref double dPan, ref double dTilt, PanoramaInfo panoimginfo)
        {
#if true
            //이미지총가로픽셀 : 이미지Pan의전체각도(360˚) = 클릭한X좌표(iX)	: ?
            dPan = (panoimginfo.nPanoImgFovW * x) / (double)m_panoCanvasWidth;

            //세로이미지의전체각도 구하기
            double dPanoImgFovH = panoimginfo.dPanoImgFovH;// panoimginfo.dPanoImgTopDeg - panoimginfo.dPanoImgBottomDeg;

            double dPanoImgTopDeg = 0.0, dPanoImgBottomDeg = 0.0;
            PanoImgInfoToTopBottomDeg(panoimginfo, ref dPanoImgTopDeg, ref dPanoImgBottomDeg);

            //수평각도구하기
            double dTiltHorizon = dPanoImgFovH + dPanoImgBottomDeg;

            //이미지총세로픽셀 : 이미지의Tilt의각도 = 클릭한Y좌표(iY)	: ?
            dTilt = (dPanoImgFovH * y) / (double)m_panoCanvasHeight;

            //틸트 총각도는 360도 이나 촬영된 이미지는 360도 아니다.
            //틸트값 보정
            dTilt -= dTiltHorizon;
            dTilt *= -1;
            if (dTilt < dTiltHorizon)// +각도
            {
                //TRACE("+ \r\n");
            }
            else if (dTilt > dTiltHorizon)// -각도
            {
                //TRACE("- \r\n");
            }
            else
            {   //TRACE("0점 \r\n");
            }

            //  [5/9/2014 Yeun]
            dPan += panoimginfo.dPanoImgStartPan;
#endif
        }