Preview2Dialog.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using PaintDotNet.Base.CommTool;
  12. using PaintDotNet.Base.SettingModel;
  13. using OpenCvSharp;
  14. using OpenCvSharp.Extensions;
  15. using System.Drawing.Imaging;
  16. using PaintDotNet.Camera;
  17. using System.Threading;
  18. using PaintDotNet.Adjust;
  19. using PaintDotNet.ImageCollect.CameraEDOF;
  20. using PaintDotNet.DbOpreate.DbModel;
  21. using PaintDotNet.ImageCollect;
  22. using PaintDotNet.Measuring;
  23. using PaintDotNet.Annotation.Enum;
  24. using PaintDotNet.Menus;
  25. using PaintDotNet.Annotation.Measure;
  26. using StageController;
  27. namespace PaintDotNet.Preview2
  28. {
  29. internal partial class Preview2Dialog : FloatingToolForm
  30. {
  31. public static Preview2Dialog Instance;
  32. public AppWorkspace _app;
  33. public DocumentWorkspaceWindow _document;
  34. public DocumentWorkspaceWindow _documentR;
  35. private DocumentStitchWindow picMatch;
  36. private ICamera _camera => CameraManager.CurrentCamera;
  37. bool _closing = false;
  38. public Preview2Dialog()
  39. {
  40. InitializeComponent();
  41. InitializeLanguageText();
  42. InitializeImages();
  43. }
  44. private void InitializeLanguageText()
  45. {
  46. this.label3.Text = PdnResources.GetString("Preview2.CameraConfig");
  47. this.label2.Text = PdnResources.GetString("Preview2.CurrentRuler");
  48. this.btnSave.Title = PdnResources.GetString("CloseWorkspaceAction.SaveButton.ActionText");
  49. this.btnBack.Title = PdnResources.GetString("CommonAction.Undo");
  50. this.btnStart.Title = PdnResources.GetString("Menu.Started.text");
  51. this.btnCapture.Title = PdnResources.GetString("Menu.ImageCollection.ShootAction.Text");
  52. this.btnMutual.Title = PdnResources.GetString("Preview2.Interactive");
  53. this.btnFit.Title = PdnResources.GetString("Menu.Edit.ZoomToWindow.Text");
  54. this.btnExposure.Title = PdnResources.GetString("Menu.timeofexposure.text");
  55. this.btnWhiteBalance.Title = PdnResources.GetString("Menu.Image.WhiteBalance.Text");
  56. this.btnSetting.Title = PdnResources.GetString("Menu.imagecapture.Previewwindow.Previewproperties.text");
  57. this.btnPreview.Title = PdnResources.GetString("Menu.Preview.text");
  58. this.Text = PdnResources.GetString("Menu.ImageCollection.PreviewExtraction.Text");
  59. }
  60. protected override void WndProc(ref Message m)
  61. {
  62. const int WM_MOUSEACTIVATE = 0x21;
  63. if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused)
  64. this.Focus();
  65. base.WndProc(ref m);
  66. }
  67. private void Preview2Dialog_Load(object sender, EventArgs e)
  68. {
  69. progressBar1.Visible = Preview2Context.P2Config.CaptureFocus;
  70. InitializeWorkspace();
  71. InitializeCamera();
  72. BindingRule();
  73. InitializeP2Config();
  74. InitializeToolbar();
  75. InitSettingList();
  76. UpdateModeDisplay(0);
  77. ConfigModel.OnCameraNameExChanged += OnNameChange;
  78. Instance = this;
  79. }
  80. void OnNameChange()
  81. {
  82. if (this.IsDisposed)
  83. {
  84. Console.WriteLine("P2Disposed"); return;
  85. }
  86. var name = _camera.GetNameEx();
  87. this.Invoke(new Action(() =>
  88. {
  89. this.Text = this.Text.Split('-')[0] + "-" + name;
  90. }));
  91. }
  92. private void Preview2Dialog_FormClosing(object sender, FormClosingEventArgs e)
  93. {
  94. _closing = true;
  95. m_isWorking = false;
  96. CameraManager.OnCameraChanged -= WhenCameraChanged;
  97. ConfigModel.OnCameraNameExChanged -= OnNameChange;
  98. CameraManager.FrameCallback -= FrameCallback;
  99. _document?.Dispose();
  100. _documentR?.Dispose();
  101. _settingForm?.Close();
  102. Instance = null;
  103. _app.RefreshMeasureListView();
  104. _app.RefreshListView();
  105. Instance = null;
  106. }
  107. void InitializeWorkspace()
  108. {
  109. _document = new DocumentWorkspaceWindow(_app);
  110. _document.Dock = DockStyle.Fill;
  111. _document.IsCreatThumb = false;
  112. _document.refueshZoomTrackValue = false;
  113. _document.rules = Startup.instance.rules;
  114. _document.oldDrawTreeView = MeasureListDialog.drawNodes;
  115. pnlPreviewContainer.Controls.Add(_document);
  116. _documentR = new DocumentWorkspaceWindow(_app);
  117. _documentR.Dock = DockStyle.Fill;
  118. _documentR.IsCreatThumb = false;
  119. _documentR.rules = Startup.instance.rules;
  120. _documentR.ActiveTool = DrawToolType.MoveMode;
  121. _documentR.oldDrawTreeView = MeasureListDialog.drawNodes;
  122. pnlResultContainer.Controls.Add(_documentR);
  123. }
  124. protected override bool ProcessFormHotKey(Keys e)
  125. {
  126. if (e == Keys.Delete || e == Keys.Escape)
  127. { _document.MouseEvent_Del(null, null); }
  128. else if (e == (Keys.Control | Keys.Z))
  129. {
  130. _document.undoManager.Undo();
  131. _document.Refresh();
  132. }
  133. else if (e == (Keys.Control | Keys.Z))
  134. {
  135. _document.undoManager.Redo();
  136. _document.Refresh();
  137. }
  138. else
  139. {
  140. return base.ProcessFormHotKey(e);
  141. }
  142. return true;
  143. }
  144. void InitializeCamera()
  145. {
  146. CameraConfigs.GetInstance().CameraParamInit();
  147. CameraManager.OnCameraChanged += WhenCameraChanged;
  148. CameraManager.FrameCallback += FrameCallback;
  149. OnNameChange();
  150. }
  151. void InitializeImages()
  152. {
  153. //先单独获取App基础配置
  154. var configModel = XmlSerializeHelper.DESerializer<ConfigModel>(FileOperationHelper.ReadStringFromFile(Application.StartupPath + "\\Config\\" + "Default" + "\\Config.xml", FileMode.Open));
  155. PdnResources.Initialize(configModel);
  156. btnPreview.Icon = PdnResources.GetImageResource("Icons.p2preview.png").Reference;
  157. btnCapture.Icon = PdnResources.GetImageResource("Icons.p2capture.png").Reference;
  158. btnExposure.Icon = PdnResources.GetImageResource("Icons.p2exposure.png").Reference;
  159. btnFit.Icon = PdnResources.GetImageResource("Icons.p2fit.png").Reference;
  160. btnWhiteBalance.Icon = PdnResources.GetImageResource("Icons.p2whitebalance.png").Reference;
  161. btnSetting.Icon = PdnResources.GetImageResource("Icons.p2setting.png").Reference;
  162. btnBack.Icon = PdnResources.GetImageResource("Icons.p2back.png").Reference;
  163. btnStart.Icon = PdnResources.GetImageResource("Icons.p2start.png").Reference;
  164. btnSave.Icon = PdnResources.GetImageResource("Icons.p2save_big.png").Reference;
  165. btnMutual.Icon = PdnResources.GetImageResource("Icons.p2mutual.png").Reference;
  166. btnResize.Icon = PdnResources.GetImageResource("Icons.Resize.png").Reference;
  167. }
  168. void InitializeP2Config()
  169. {
  170. Preview2SettingDialog.OnDrawGridChanged += UpdateGridDraw;
  171. UpdateGridDraw();
  172. }
  173. void UpdateGridDraw()
  174. {
  175. _document.GridLineEnabled = Preview2Context.P2Config.DrawGrid;
  176. _document.GridRectangleEnabled = Preview2Context.P2Config.DrawRect;
  177. _document.GridCrossCurveEnabled = Preview2Context.P2Config.DrawCross;
  178. _document.GridRoundEnabled = Preview2Context.P2Config.DrawCircle;
  179. }
  180. #region Toolkit
  181. ToolkitControl _toolpanelL;
  182. ToolkitControl _toolpanelR;
  183. void InitializeToolbar()
  184. {
  185. _toolpanelL = new ToolkitControl(_app, _document);
  186. _toolpanelL.Dock = DockStyle.Fill;
  187. panelLeft.Controls.Add(_toolpanelL);
  188. _toolpanelR = new ToolkitControl(_app, _document);
  189. _toolpanelR.Dock = DockStyle.Fill;
  190. panelRight.Controls.Add(_toolpanelR);
  191. ToolkitEditControl.OnToolbarUpdate += () =>
  192. {
  193. _toolpanelL.UpdateTools(Preview2Context.ToolbarModelLeft);
  194. _toolpanelR.UpdateTools(Preview2Context.ToolbarModelRight);
  195. };
  196. _toolpanelL.UpdateTools(Preview2Context.ToolbarModelLeft);
  197. _toolpanelR.UpdateTools(Preview2Context.ToolbarModelRight);
  198. Preview2SettingDialog.OnToolkitSideChanged += OnToolkitSideChanged;
  199. OnToolkitSideChanged();
  200. }
  201. private void OnToolkitSideChanged()
  202. {
  203. if ((Preview2Context.P2Config.ToolkitSide & 1) == 1)
  204. {
  205. tableLayoutPanel1.ColumnStyles[0] = new ColumnStyle(SizeType.Absolute, 50);
  206. }
  207. else
  208. {
  209. tableLayoutPanel1.ColumnStyles[0] = new ColumnStyle(SizeType.Absolute, 0);
  210. }
  211. if ((Preview2Context.P2Config.ToolkitSide & 2) == 2)
  212. {
  213. tableLayoutPanel1.ColumnStyles[3] = new ColumnStyle(SizeType.Absolute, 50);
  214. }
  215. else
  216. {
  217. tableLayoutPanel1.ColumnStyles[3] = new ColumnStyle(SizeType.Absolute, 0);
  218. }
  219. }
  220. #endregion
  221. #region Preview
  222. private void WhenCameraChanged(ICamera old, ICamera current)
  223. {
  224. OnNameChange();
  225. }
  226. private void FrameCallback(Bitmap img)
  227. {
  228. try
  229. {
  230. ShowFrame(img.Clone() as Bitmap);
  231. m_mat = PaintDotNet.Camera.Tools.ToMat(img);
  232. }
  233. catch { }
  234. if (_closing) return;
  235. double value = 0;
  236. if (Preview2Context.P2Config.CaptureFocus)
  237. value = getMeanValueOfBitmap(img.Clone() as Bitmap);
  238. try
  239. {
  240. this.Invoke(new Action(() =>
  241. {
  242. if (Preview2Context.P2Config.CaptureFocus)
  243. {
  244. progressBar1.Visible = true;
  245. progressBar1.Value = value;
  246. }
  247. else
  248. {
  249. progressBar1.Visible = false;
  250. }
  251. }));
  252. this.Invoke(new Action(() =>
  253. {
  254. _toolpanelL.UpdateDisplay();
  255. _toolpanelR.UpdateDisplay();
  256. }));
  257. }
  258. catch { }
  259. return;
  260. }
  261. private void ShootCallback(Bitmap img)
  262. {
  263. if (_workMode == 0)
  264. {
  265. var mode = Startup.instance.configModel.CaptureSaveMode;
  266. this.Invoke(new Action(() =>
  267. {
  268. _app.DisplayShoot(img, _document.GraphicsList, Preview2Context.P2Config.CaptureRuler, mode);
  269. if (Preview2Context.P2Config.CaptureClose)
  270. this.Close();
  271. }));
  272. }
  273. if (_workMode == 2)
  274. {
  275. m_isWorking = true;
  276. Depth(PaintDotNet.Camera.Tools.ToMat(img));
  277. }
  278. }
  279. #endregion
  280. #region Setting
  281. Preview2SettingDialog _settingForm;
  282. private void InitSettingList()
  283. {
  284. List<string> fileNames = CameraConfigs.GetInstance().GetAllConfigFiles();
  285. cmbConfig.Items.AddRange(fileNames.ToArray());
  286. var name = Preview2Context.P2Config.GetCamCfg(_camera);
  287. if (cmbConfig.Items.Contains(name))
  288. cmbConfig.SelectedItem = name;
  289. else
  290. cmbConfig.SelectedItem = CommonDefine.DefaultCamCfg;
  291. cmbConfig.SelectedIndexChanged += this.cmbConfig_SelectedIndexChanged;
  292. }
  293. private void cmbConfig_SelectedIndexChanged(object sender, EventArgs e)
  294. {
  295. var name = cmbConfig.Text;
  296. if (name == CameraConfigs.GetInstance().CurrentConfigFileName)
  297. return;
  298. var cpm = CameraConfigs.GetInstance().GetCameraParamModel(name);
  299. Startup.instance.cameraParamModel = cpm;
  300. Startup.instance.configModel.CameraConfig = name;
  301. string configXml = XmlSerializeHelper.XmlSerialize<ConfigModel>(Startup.instance.configModel);
  302. string filePath = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\Config.xml";
  303. FileOperationHelper.WriteStringToFile(configXml, filePath, FileMode.Create);
  304. CameraConfigs.GetInstance().CameraParamInit();
  305. }
  306. private void CameraSettingChanged(int type, string name)
  307. {
  308. if (type == 0)
  309. {
  310. cmbConfig.SelectedItem = name;
  311. }
  312. if (type == 1)
  313. {
  314. cmbConfig.Items.Add(name);
  315. cmbConfig.SelectedItem = name;
  316. }
  317. if (type == 2)
  318. {
  319. cmbConfig.Items.Remove(name);
  320. cmbConfig.SelectedItem = "CameraParam";
  321. }
  322. }
  323. private void btnSetting_Click(object sender, EventArgs e)
  324. {
  325. if (_settingForm == null)
  326. {
  327. _settingForm = new Preview2SettingDialog(_document);
  328. _settingForm.Load += (s1, e1) =>
  329. {
  330. cmbConfig.Enabled = false;
  331. };
  332. _settingForm.FormClosing += (s1, e1) =>
  333. {
  334. cmbConfig.Enabled = true;
  335. _settingForm = null;
  336. };
  337. _settingForm.OnConfigModify = CameraSettingChanged;
  338. FloatingFormMethod.ShowFloatForm(null, _settingForm, _app);
  339. }
  340. _settingForm.Activate();
  341. }
  342. System.Drawing.Point _lastLocation;
  343. /// <summary>
  344. /// 预览设置跟随主窗体移动
  345. /// </summary>
  346. private void Preview2Dialog_Move(object sender, EventArgs e)
  347. {
  348. var settingForm = _settingForm;
  349. if (settingForm != null)
  350. {
  351. var x = Location.X - _lastLocation.X;
  352. var y = Location.Y - _lastLocation.Y;
  353. settingForm.FormMove(x, y);
  354. }
  355. _lastLocation = Location;
  356. }
  357. #endregion
  358. #region Show Frame
  359. /// <summary>
  360. /// 在 documentview 中显示 预览
  361. /// </summary>
  362. /// <param name="img"></param>
  363. private void ShowFrame(Bitmap img)
  364. {
  365. var mat = PaintDotNet.Camera.Tools.ToMat(img);
  366. if (Preview2Context.ShandingCorrectionState == 1)//阴影矫正
  367. mat = AdjustIntent.ShadingCorrection(mat);
  368. _document.Document = Document.FromMat(mat);
  369. }
  370. #endregion
  371. #region 工作模式
  372. ModeMenuControl _modeMenu;
  373. /// <summary>
  374. /// 0:预览,1:拼图,2:景深
  375. /// </summary>
  376. int _workMode = -1;
  377. private void btnPreview_Click(object sender, EventArgs e)
  378. {
  379. if (_modeMenu == null)
  380. {
  381. _modeMenu = new ModeMenuControl();
  382. _modeMenu.PreviewModeClick = () => UpdateModeDisplay(0);
  383. _modeMenu.StitchModeClick = () => UpdateModeDisplay(1); ;
  384. _modeMenu.DeepModeClick = () => UpdateModeDisplay(2);
  385. _modeMenu.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
  386. this.Controls.Add(_modeMenu);
  387. _modeMenu.BringToFront();
  388. }
  389. else
  390. {
  391. _modeMenu.Visible = !_modeMenu.Visible;
  392. }
  393. _modeMenu.Left = this.Width - _modeMenu.Width - 20;
  394. _modeMenu.Top = this.Height - _modeMenu.Height - 120;
  395. }
  396. /// <summary>
  397. /// 0预览模式 1拼图模式 2景深模式
  398. /// </summary>
  399. private void UpdateModeDisplay(int mode)
  400. {
  401. if (_workMode == mode) return;
  402. StopWork();
  403. _documentR.Document?.Dispose();
  404. m_merge = null;
  405. _workMode = mode;
  406. btnCapture.Visible = false;
  407. btnStart.Visible = false;
  408. btnSave.Visible = false;
  409. btnBack.Visible = false;
  410. btnMutual.Visible = false;
  411. btnMutual.Selected = false;
  412. btnResize.Visible = false;
  413. btnResize.Selectable = true;
  414. btnMutual.Selectable = true;
  415. pnlResultContainer.Controls.Clear();
  416. _documentR.Document = Document.FromImage(new Bitmap(1, 1));
  417. switch (_workMode)
  418. {
  419. case 0:
  420. btnPreview.Text = PdnResources.GetString("Menu.ImageCollection.Text");
  421. btnCapture.Visible = true;
  422. tableLayoutPanel1.ColumnStyles[2] = new ColumnStyle(SizeType.Percent, 0f);
  423. break;
  424. case 1:
  425. btnPreview.Text = PdnResources.GetString("Menu.Image.ImageStitching.Text");
  426. btnStart.Visible = true;
  427. btnSave.Visible = true;
  428. btnResize.Visible = true;
  429. tableLayoutPanel1.ColumnStyles[2] = new ColumnStyle(SizeType.Percent, 50f);
  430. break;
  431. case 2:
  432. btnPreview.Text = PdnResources.GetString("Menu.Image.DepthExtension.Text");
  433. btnStart.Visible = true;
  434. btnSave.Visible = true;
  435. btnMutual.Visible = true;
  436. tableLayoutPanel1.ColumnStyles[2] = new ColumnStyle(SizeType.Percent, 50f);
  437. pnlResultContainer.Controls.Add(_documentR);
  438. break;
  439. }
  440. }
  441. #region Operate
  442. private void btnMutual_Click(object sender, EventArgs e)
  443. {
  444. StopWork();
  445. m_merge = null;
  446. _lastDetp = null;
  447. _documentR.Document = Document.FromImage(new Bitmap(1, 1));
  448. btnMutual.Selected = !btnMutual.Selected;
  449. btnStart.Visible = !btnMutual.Selected;
  450. btnCapture.Visible = btnMutual.Selected;
  451. btnBack.Visible = btnMutual.Selected;
  452. }
  453. private void btnStart_Click(object sender, EventArgs e)
  454. {
  455. if (m_isWorking)
  456. {
  457. StopWork();
  458. }
  459. else
  460. {
  461. StartWork();
  462. }
  463. }
  464. private void btnCapture_Click(object sender, EventArgs e)
  465. {
  466. CameraManager.Shoot(ShootCallback);
  467. }
  468. private void btnBack_Click(object sender, EventArgs e)
  469. {
  470. if (_lastDetp == null) return;
  471. m_merge = _lastDetp.Clone();
  472. _lastDetp = null;
  473. _documentR.Document = Document.FromMat(m_merge.Clone());
  474. }
  475. private void btnSave_Click(object sender, EventArgs e)
  476. {
  477. if (m_merge == null)
  478. {
  479. if (_workMode == 1)
  480. MessageBox.Show(PdnResources.GetString("Menu.mageMosaicimagehanotbeengeneratedyet.Text"));
  481. else if (_workMode == 2)
  482. MessageBox.Show(PdnResources.GetString("Menu.ofimageshavenotyetbeengene.Text"));
  483. return;
  484. }
  485. //Bitmap bitmap = BitmapConverter.ToBitmap(m_merge);
  486. _pause = true;
  487. DocumentWorkspace dw = _app.NewDocumentWorkspace();
  488. Mat mat = null;
  489. float ratio = 1;
  490. int len = 0;
  491. int pix = 0;
  492. if (_workMode == 1)
  493. {
  494. if (_useBig)
  495. mat = picMatch.StitchMat.Clone();
  496. else
  497. mat = m_merge.Clone();
  498. int width = Startup.instance.configModel.MaxWidth;
  499. int height = Startup.instance.configModel.MaxHeight;
  500. if (btnResize.Selected && (width < mat.Width || height < mat.Height) && (width + height) > 0)
  501. {
  502. if (Startup.instance.configModel.MaxUnit == 0)
  503. {
  504. var ulen = Startup.instance.ruleDB.pixel_length / (float)Startup.instance.ruleDB.physical_length;
  505. width = (int)(width * ulen);
  506. height = (int)(height * ulen);
  507. }
  508. if (Startup.instance.configModel.MaxLocked)
  509. {
  510. if (width == 0)
  511. {
  512. ratio = height * 1.0f / mat.Height;
  513. width = (int)(mat.Width * ratio);
  514. len = Startup.instance.configModel.MaxHeight;
  515. pix = height;
  516. }
  517. else
  518. {
  519. ratio = width * 1.0f / mat.Width;
  520. height = (int)(mat.Height * ratio);
  521. len = Startup.instance.configModel.MaxWidth;
  522. pix = width;
  523. }
  524. }
  525. else
  526. {
  527. width = width == 0 ? mat.Width : width;
  528. height = height == 0 ? mat.Height : height;
  529. }
  530. width = Math.Min(width, mat.Width);
  531. height = Math.Min(height, mat.Height);
  532. ratio = Math.Min(1, ratio);
  533. if (width != mat.Width || height != mat.Height)
  534. Cv2.Resize(mat, mat, new OpenCvSharp.Size(width, height));
  535. }
  536. }
  537. else
  538. mat = m_merge.Clone();
  539. Document document = Document.FromImageMat(mat);
  540. dw.Document = document;
  541. dw.xmlSaveModel = Startup.instance.ruleDB.Clone();
  542. if (dw.xmlSaveModel != null)
  543. {
  544. dw.Units = MeasurementUnit.Micron;
  545. if (ratio != 1)
  546. {
  547. dw.xmlSaveModel.ruler_name = "分辨率调整";
  548. if (Startup.instance.configModel.MaxUnit == 1)
  549. dw.xmlSaveModel.pixel_length *= ratio;
  550. else
  551. {
  552. dw.xmlSaveModel.pixel_length = pix;
  553. dw.xmlSaveModel.physical_length = len;
  554. }
  555. }
  556. dw.xmlSaveModel.gain_multiple = dw.xmlSaveModel.gain_multiple / (decimal)ratio;
  557. }
  558. string name = "";
  559. if (_workMode == 1) name = PdnResources.GetString("Menu.Image.ImageStitching.Text");
  560. if (_workMode == 2) name = PdnResources.GetString("Menu.Image.DepthExtension.Text");
  561. dw.fileText = string.Format("{0}-{1:D3}", name, Startup.instance.step_length++);
  562. dw.InitRulerInfo();
  563. if (Preview2Context.P2Config.CaptureRuler)
  564. dw.ActiveTool = DrawToolType.DrawAutoRuler;
  565. _app.Add(dw);
  566. _app.ActiveDocumentWorkspace = dw;
  567. _pause = false;
  568. }
  569. #endregion
  570. #region Work
  571. bool m_isWorking = false;
  572. private bool _pause;
  573. private Thread m_stitchingThread;
  574. private Mat m_mat;
  575. private Mat m_merge;
  576. private void StartWork()
  577. {
  578. btnStart.Icon = PdnResources.GetImageResource("Icons.p2stop.png").Reference;
  579. btnStart.Title = PdnResources.GetString("Menu.stop.text");
  580. m_isWorking = true;
  581. m_merge = null;
  582. if (_workMode == 1) StartStitch();
  583. m_stitchingThread = new Thread(new ThreadStart(WaitForStitchingThreadEntry));
  584. m_stitchingThread.Start();
  585. }
  586. private int newOriX = 10000;
  587. private int newOriY = 10000;
  588. private Rect lastRect = new Rect(-10000, -10000, 0, 0);
  589. private void StartStitch()
  590. {
  591. newOriX = 10000;
  592. newOriY = 10000;
  593. pnlResultContainer.Controls.Clear();
  594. if (_useBig)
  595. {
  596. this.picMatch = new DocumentStitchWindow();
  597. pnlResultContainer.Controls.Add(picMatch);
  598. this.picMatch.Dock = DockStyle.Fill;
  599. }
  600. else
  601. pnlResultContainer.Controls.Add(_documentR);
  602. lastRect = new Rect(-10000, -10000, 0, 0);
  603. }
  604. private void StopWork()
  605. {
  606. btnStart.Icon = PdnResources.GetImageResource("Icons.p2start.png").Reference;
  607. btnStart.Title = PdnResources.GetString("Menu.Started.text");
  608. m_isWorking = false;
  609. }
  610. /// <summary>
  611. /// 图像拼接
  612. /// </summary>
  613. private void WaitForStitchingThreadEntry()
  614. {
  615. while (m_isWorking)
  616. {
  617. if (m_mat == null || _pause)// || AxisController.GetInstance().IsMoving)
  618. {
  619. //if (_useBig) m_mat = new Mat(@"C:\Users\win10SSD\Desktop\工作目录\小图片\0e2442a7d933c8956c0e8eeadb1373f08202002a.jpg");
  620. Thread.Sleep(20);
  621. continue;
  622. }
  623. if (_workMode == 1)
  624. {
  625. if (_useBig)
  626. StitchBig(m_mat);
  627. else
  628. Stitch(m_mat);
  629. }
  630. if (_workMode == 2)
  631. Depth(m_mat);
  632. }
  633. }
  634. private void Depth(Mat mat)
  635. {
  636. if (!m_isWorking) return;
  637. if (m_merge == null) m_merge = mat.Clone();
  638. else
  639. {
  640. _lastDetp = m_merge.Clone();
  641. m_merge = Merge.GetMergeMatForCamera(new Mat[] { mat, m_merge });
  642. }
  643. if (!m_isWorking)
  644. {
  645. m_merge = null;
  646. return;
  647. }
  648. _documentR.Document = Document.FromMat(m_merge.Clone());
  649. GC.Collect();
  650. }
  651. /// <summary>
  652. /// 大图拼接调试模式,正式版时候设置为false
  653. /// </summary>
  654. private bool _useBig => Startup.instance.useBigFile;
  655. private void Stitch(Mat mat)
  656. {
  657. if (m_merge == null)
  658. {
  659. AdjustIntent.InitMatchPicOneByOne(_useBig);
  660. }
  661. Rect rect;
  662. var result = AdjustIntent.MatchPicRealtime(mat, m_merge, out bool error, out rect);
  663. if (!error)
  664. {
  665. Console.WriteLine("开始贴图");
  666. m_merge = result.Clone();
  667. var Ratio = _documentR.ScaleFactor.Ratio;
  668. int pw = (int)(2 / Ratio) + 1;
  669. // result = m_merge.Clone();
  670. result.Rectangle(rect, Scalar.Lime, pw);
  671. _documentR.Document = Document.FromMat(result);
  672. Console.WriteLine("贴图结束");
  673. }
  674. else
  675. {
  676. Console.WriteLine(PdnResources.GetString("Menu.Jigsawpuzzlefailure.Text"));
  677. }
  678. if (!m_isWorking) return;
  679. //var tmp = m_merge.Clone();
  680. //pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(tmp);
  681. //pictureBox1.Invalidate();
  682. GC.Collect();
  683. }
  684. private void StitchBig(Mat mat)
  685. {
  686. if (m_merge == null)
  687. {
  688. m_merge = new Mat(20000 + newOriY, 20000 + newOriX, MatType.CV_8UC3);
  689. picMatch.StitchDocument = StitchDocument.FromMat(m_merge/*tmp*/);
  690. picMatch.StitchBounds = new Rectangle(newOriX, newOriY, 0, 0);
  691. picMatch.StitchDocument.surface.stitchBackColor = picMatch.BackColor;
  692. picMatch.ActiveTool = Annotation.Enum.DrawToolType.MoveMode;
  693. AdjustIntent.InitMatchPicOneByOne(_useBig, newOriX, newOriY, m_merge);
  694. }
  695. Rect rect;
  696. var time = DateTime.Now;
  697. var result = AdjustIntent.MatchPicRealtime(mat, m_merge, out bool error, out rect);
  698. if (!error)
  699. {
  700. if (result != null)
  701. m_merge = result;
  702. }
  703. else
  704. {
  705. // Console.WriteLine("拼图失败");
  706. }
  707. picMatch.GraphicsList.Clear();
  708. MeasureRectangle rectObject = new MeasureRectangle(picMatch, rect.X, rect.Y, rect.Width, rect.Height);
  709. picMatch.GraphicsList.Add(rectObject);
  710. int disX = Math.Abs(rect.X - lastRect.X);
  711. int disY = Math.Abs(rect.Y - lastRect.Y);
  712. bool resized = false;//判断是否重新定位大图区域
  713. if (picMatch.StitchBounds.Width == 0)
  714. {
  715. resized = true;
  716. picMatch.StitchDocument.surface.stitchBounds.Width = rect.Width;// matNew.Width;
  717. picMatch.StitchDocument.surface.stitchBounds.Height = rect.Height;// matNew.Height;
  718. }
  719. else
  720. {
  721. int x = Math.Min(picMatch.StitchBounds.X, rect.X);
  722. int y = Math.Min(picMatch.StitchBounds.Y, rect.Y);
  723. int x2 = Math.Max(picMatch.StitchBounds.Right, rect.Right);
  724. int y2 = Math.Max(picMatch.StitchBounds.Bottom, rect.Bottom);
  725. picMatch.StitchBounds = new Rectangle(x, y, x2 - x, y2 - y);
  726. }
  727. if (_closing || !m_isWorking) return;
  728. this.BeginInvoke(new Action(() =>
  729. {
  730. if (disX > 500 || disY > 500)
  731. {
  732. picMatch.ZoomBasis = ZoomBasis.ScaleFactor;
  733. picMatch.ZoomBasis = ZoomBasis.FitToWindow;
  734. picMatch.ZoomBasis = ZoomBasis.ScaleFactor;
  735. picMatch.panel.HorizontalScroll.Value = (int)(picMatch.panel.HorizontalScroll.Maximum * picMatch.StitchBounds.X / (picMatch.StitchWidth));
  736. picMatch.panel.VerticalScroll.Value = (int)(picMatch.panel.VerticalScroll.Maximum * picMatch.StitchBounds.Y / picMatch.StitchHeight);
  737. lastRect = rect;
  738. }
  739. picMatch.Refresh();
  740. }));
  741. //Console.WriteLine((DateTime.Now - time).TotalMilliseconds);
  742. //time = DateTime.Now;
  743. Thread.Sleep(50);
  744. }
  745. #endregion
  746. #endregion
  747. #region Operation
  748. private void btnWhiteBalance_Click(object sender, EventArgs e)
  749. {
  750. btnWhiteBalance.PressDownThenBack();
  751. new Task(() =>
  752. {
  753. _camera.WhiteBalanceMode = 1;
  754. CameraConfigs.Settings.WhiteBalance = 1;
  755. Thread.Sleep(1000);
  756. _camera.WhiteBalanceMode = 0;
  757. CameraConfigs.Settings.WhiteBalance = 0;
  758. }).Start();
  759. }
  760. private void btnFit_Click(object sender, EventArgs e)
  761. {
  762. _document.ZoomToWindow();
  763. }
  764. private void btnExposure_Click(object sender, EventArgs e)
  765. {
  766. btnExposure.PressDownThenBack();
  767. new Task(() =>
  768. {
  769. _camera.AutoExposure = 1;
  770. CameraConfigs.Settings.ATExposure = 1;
  771. Thread.Sleep(1000);
  772. _camera.AutoExposure = 0;
  773. CameraConfigs.Settings.ATExposure = 0;
  774. }).Start();
  775. }
  776. #endregion
  777. #region Ruler
  778. /// <summary>
  779. /// 绑定标尺
  780. /// </summary>
  781. public void BindingRule()
  782. {
  783. this.comboBox1.Items.Clear();
  784. //绑定标尺下拉菜单
  785. List<mic_rulers> list = Startup.instance.mic_rulersAll;
  786. string rulerName = "";
  787. if (list != null)
  788. {
  789. for (int ruleI = 0; ruleI < list.Count; ruleI++)
  790. {
  791. mic_rulers rule = list[ruleI];
  792. int rulid = rule.id;
  793. if (rulid == Startup.instance.configModel.RulerId)
  794. {
  795. rulerName = rule.ruler_name;
  796. }
  797. this.comboBox1.Items.Add(rule.ruler_name);
  798. }
  799. }
  800. for (int i = 0; i < this.comboBox1.Items.Count; i++)
  801. {
  802. if (rulerName.Equals(this.comboBox1.Items[i].ToString()))
  803. {
  804. this.comboBox1.SelectedIndex = i;
  805. }
  806. }
  807. }
  808. private void Ruler_SelectedIndexChanged(object sender, EventArgs e)
  809. {
  810. var name = comboBox1.Text;
  811. if (string.IsNullOrEmpty(name)) return;
  812. //comboBox_Change = true;
  813. List<mic_rulers> list = Startup.instance.mic_rulersAll;
  814. if (list != null)
  815. {
  816. for (int ruleI = 0; ruleI < list.Count; ruleI++)
  817. {
  818. mic_rulers rule = list[ruleI];
  819. if (rule.ruler_name.Equals(name))
  820. {
  821. int rulid = rule.id;
  822. if (rulid != Startup.instance.configModel.RulerId)
  823. {
  824. //设置当前选中标尺
  825. _app.SetActiveRulerIndex(((ComboBox)sender).SelectedIndex);
  826. _document.rules = Startup.instance.rules;
  827. _document.Refresh();
  828. }
  829. break;
  830. }
  831. }
  832. getRulerMicronRatio();
  833. _document.Refresh();
  834. }
  835. }
  836. private double _micronRatio;//每像素多少微米
  837. /// <summary>
  838. /// 获取当前标尺并换算为微米
  839. /// </summary>
  840. void getRulerMicronRatio()
  841. {
  842. Startup.instance.rules.TryGetValue(MeasurementUnit.Micron, out this._micronRatio);
  843. _document.MicronRatio = this._micronRatio;
  844. }
  845. #endregion
  846. private void Preview2Dialog_Activated(object sender, EventArgs e)
  847. {
  848. BindingRule();
  849. }
  850. /// <summary>
  851. /// 获取输入图片的清晰度
  852. /// </summary>
  853. /// <param name="bitmap"></param>
  854. /// <returns></returns>
  855. private static double getMeanValueOfBitmap(Bitmap bitmap)
  856. {
  857. Mat converted = PaintDotNet.Camera.Tools.ToMat(bitmap);
  858. Mat imageGrey = new Mat();
  859. Mat imageSobel = new Mat();
  860. try
  861. {
  862. if (converted.Channels() == 3)
  863. OpenCvSharp.Cv2.CvtColor(converted, imageGrey, OpenCvSharp.ColorConversionCodes.RGB2GRAY);
  864. else if (converted.Channels() == 1)
  865. imageGrey = converted;
  866. }
  867. catch (Exception)
  868. {
  869. imageGrey = converted;
  870. }
  871. OpenCvSharp.Mat meanValueImage = new OpenCvSharp.Mat();
  872. OpenCvSharp.Mat meanStdValueImage = new OpenCvSharp.Mat();
  873. //求灰度图像的标准差 值越大越好
  874. OpenCvSharp.Cv2.MeanStdDev(imageGrey, meanValueImage, meanStdValueImage);
  875. return meanStdValueImage.At<double>(0, 0);
  876. }
  877. #region 适配全局菜单按钮事件
  878. internal void SetActiveTool(DrawToolType measurePointArcSize)
  879. {
  880. _document.ActiveTool = measurePointArcSize;
  881. }
  882. public void DrawObjClear()
  883. {
  884. _document.GraphicsList.Clear();
  885. _document.Refresh();
  886. }
  887. public void DrawObjSelectAll()
  888. {
  889. _document.GraphicsList.SelectAll();
  890. _document.Refresh();
  891. }
  892. #endregion
  893. private void Preview2Dialog_ResizeEnd(object sender, EventArgs e)
  894. {
  895. if (WindowState == FormWindowState.Normal)
  896. {
  897. if (Location.Y < 0)
  898. Location = _lb;
  899. }
  900. }
  901. System.Drawing.Point _lb;
  902. private Mat _lastDetp;
  903. private void Preview2Dialog_ResizeBegin(object sender, EventArgs e)
  904. {
  905. if (WindowState == FormWindowState.Normal)
  906. _lb = new System.Drawing.Point(Location.X, Math.Max(0, Location.Y));
  907. }
  908. private void timer1_Tick(object sender, EventArgs e)
  909. {
  910. //panel1.Enabled = CameraManager.IsLive;
  911. }
  912. private void btnResize_Click(object sender, EventArgs e)
  913. {
  914. btnResize.Selected = !btnResize.Selected;
  915. }
  916. }
  917. }