void PanoImgInfoToTopBottomDeg(PanoramaInfo panoimginfo, ref double dTopDeg, ref double dBottomDeg) { dTopDeg = dBottomDeg = panoimginfo.dPanoImgFovH / 2; dBottomDeg *= -1; dTopDeg += panoimginfo.dPanoImgTiltPivotDeg; dBottomDeg += panoimginfo.dPanoImgTiltPivotDeg; }
public void SetChInfo(int nCh, PanoramaInfo info, MainWindow mainWndPrt) { m_nCh = nCh; this.mainWndPtr = mainWndPrt; panoSetupWindow.SetChinfo(nCh, info, mainWndPtr); panoSetupWindow.Topmost = true; }
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); }
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(); }
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); }
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 }
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); }
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; }
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 }