ã¯ããã«

ç»ååŠçã«ã¯ãåºãæ®åããŠããOpenCVã©ã€ãã©ãªã䜿çšããŠãã ãã ã .netã§ã¯ç®¡çãããŠããªããããã©ãããŒOpenCvSharpãä»ããŠæ¥ç¶ããŸãã
ç»åã«ããŸããŸãªå€æãé©çšããèæ¯ãšåœ±ããªããžã§ã¯ãããåé¢ãããªããžã§ã¯ããçžäºã«åé¢ããå€æãéžæããã«ã¯ãOpenCVãå¿ èŠã§ãã ä»æ¥ã¯ãã®ç®æšã«åãã£ãŠé²ã¿ãŸãã
ã«ããŒãããŠãããããã¯ ïŒ ç»ååŠççšã®ã©ã€ãã©ãªã®éžæãOpenCVã䜿çšããããã®ã©ãããŒã®éžæãåºæ¬çãªOpenCVé¢æ°ã移åãªããžã§ã¯ãã®åŒ·èª¿è¡šç€ºãHSVã«ã©ãŒã¢ãã«ã
ãªãopencvã§ããïŒ
ä»ã®ç»ååŠççšã®åªããã©ã€ãã©ãªããããŸããããOpenCVã§ã¯ãå ãåæããŸããã§ããã.netã§ããã°ã©ãã³ã°ããå Žåã Accord.Netã©ã€ãã©ãªïŒããã³ãã®ä»¥åã®ããŒãžã§ã³ã®AForge.Net ïŒã«ã泚æãæã䟡å€ããããŸãã ãããã®2ã€ã®ã©ã€ãã©ãªãç¡æã§ãããOpenCVãšã¯ç°ãªãã.netãã©ãããã©ãŒã ã®ãã€ãã£ãïŒç®¡ç察象ïŒã§ãã
ã楜ãã¿ã®ãããã§ã¯ãªãã販売çšã®è£œåãéçºãããšãã¯ããããŒãžã©ã€ãã©ãªã«éäžããããšæããŸãã é©åãªãããŒãžã©ã€ãã©ãªãéžæããŠãããã©ãŒãã³ã¹ã¯äœäžããŸããããå±éã移æ€æ§ãããã³ãã®åŸã®ã¡ã³ããã³ã¹ãå€§å¹ ã«ç°¡çŽ åãããŸãã ããããã¹ã¿ãŒãã¢ãããã楜ãã¿ã®ãããã®éçºã§ã¯ãå°æ¥ã®ã¡ã³ããã³ã¹ã®ç°¡çŽ åããã倧ããªã³ãã¥ããã£ã®æ¹ãéèŠã§ãã ãããŠããããOpenCVã©ã€ãã©ãªã«æ»ã£ãŠããŸãããããã¯ãã¯ããã«åºãç¥ãããŠããŸãã
倧ããªã³ãã¥ããã£
ã©ã€ãã©ãªãç¬ç«ããŠéžæã§ããããã倧èŠæš¡ã§æŽ»çºãªã³ãã¥ããã£ãæã€ã©ã€ãã©ãªã«çŠç¹ãåœãŠãããšã¯çã«ããªã£ãŠããŸãã å€æ°ã®ãã©ãã¯ãŒããé«ããã¹ãã©ã€ãã©ãªãããããããªäžäŸ¿ããããŸããŸãªããã¥ã¡ã³ããæäŸããäœæ¥äžã«çºçãã質åãGoogleã§ç°¡åã«æ€çŽ¢ã§ããããã«ããŸããOpenCVã¯ãã®è«æãå®å šã«ãµããŒãããŠããŸãã æ¬ããããŸãïŒ OpenCVãåŠã¶ ïŒ æ£çŽããŸã èªãã§ããŸããããè¿ããã¡ã«ä¿®æ£ããŸã ïŒ stackoverflow㧠ã
ãã®ãã¹ãŠã®æ¡çšã«ããããPliïŒ æºåãããªããïŒ ç®çã¯ãã¯ã©ã·ãã¯ãã§ã¯ãªãããã©ã€ãã©ãªãåŠç¿ããªããåŠç¿ãããããšã§ãã ç®æãïŒ PliïŒãïŒæåã«ã©ã€ãã©ãªããã€ã¹ã®äºåç¥èã«ããªãã®æéãè²»ããããšãïŒã
Googleã®è³ªå
ã»ãšãã©ã®ã¿ã¹ã¯ã¯ãã¯ã€ãã¯googleã䜿çšããŠè§£æ±ºãããŸãããããŒã¯ãŒãã¯è³ªåã®ä»¶åã§Googleã«å ¥åãããåçã¯æåã®ãªã³ã¯ã«ããã«è¡šç€ºãããŸãã èªåã§åçãæ€çŽ¢ããå Žåã¯ãç®çã®ãããã¯ã説æããããã«äœ¿çšãããããŒã¯ãŒãã«æ³šæããŠãã ããã Googleã¯è³ªåã®çŸãããšææ³çãªæ£ç¢ºããæ°ã«ããŸãã;ããã¯ãããŒã¯ãŒãã®ååšã ããéèŠã§ãããããã«ãã£ãŠçããéžæããããã§ãã解決ãã¹ãåé¡ã®äŸïŒ
-ç»åããRã³ã³ããŒãã³ããéžæããŸã-Googleãªã¯ãšã¹ãïŒ googleïŒopencv get single channel ãæåã®ãªã³ã¯ã¯ããããSplité¢æ°ã䜿çšããŠè¡ãããããšã瀺ããŠããŸã
-ç»åéã®éããèŠã€ããïŒ googleïŒopencv difference images ãæåã®çãã®äŸã§ã¯ãabsdiffé¢æ°ããããè¡ããšè¿°ã¹ãŠããŸãã æ€çŽ¢æã«å·®ã§ã¯ãªãåèªæ¯èŒã䜿çšãããšãGoogleã¯å®å šã«ç°ãªãããŒãžã衚瀺ãå§ããŸããããã«ããããã¹ãã°ã©ã æ¯èŒãªã©ã®äœ¿çšãæšå¥šããäžè¬çãªåçãåŸãããŸãã ããã¯ã質åãžã®åçãæ€çŽ¢ãããšãã«ããŒã¯ãŒããéžæããããšã®éèŠæ§ã瀺ããŠããŸãã
OpenCVçšã®.net-wrapperã®éžæ
ã©ã€ãã©ãªãéžæãããŸããããCïŒãšåéã«ãªããŸãã ãã®åé¡ã¯ãã§ã«è§£æ±ºãããŠããã䜿çšå¯èœãªãªãã·ã§ã³ãéžæããã ãã§æžã¿ãŸãã äžè¬çãªã©ãããŒã«ã¯ãEmmu CvãšOpenCvSharpã® 2ã€ããããŸãã Emgu Cvã¯ããå€ãããããã©ãŒãã«ã§ãOpenCvSharpã¯ããã¢ãã³ã§ãã éžæã¯OpenCvSharpã«éå®ãããIDisposableããµããŒããããŠãããšããèè ã®èšèãåããŸããã ããã¯ãäœæè ãæ§é ãšé¢æ°ãC / C ++ããCïŒ1 in 1ã«è»¢éããã ãã§ãªãããããããã¡ã€ã«ã«è¿œå ããŠãCïŒã¹ã¿ã€ã«ã®ã³ãŒãèšè¿°ã§äœ¿çšããæ¹ã䟿å©ã«ãªãããšãæå³ããŸããOpenCvSharpããããžã§ã¯ãã«æ¥ç¶ãã
OpenCvSharpã®ãããžã§ã¯ããžã®æ¥ç¶ã¯ãç¹å¥ãªæéããããã«æšæºçãªæ¹æ³ã§è¡ãããŸãã èè ããã®å°ããªãã¥ãŒããªã¢ã«ããããŸãããŸãã nugetãä»ããŠOpenCvSharpã«æ¥ç¶ããæ©èœããããŸããåºæ¬çãªåºæ¬æ©èœ
OpenCVã«ã¯ãç»åãæäœããããã®å€ãã®æ©èœããããŸãã ç»åãããªããžã§ã¯ããæœåºããåé¡ã解決ããããã«äœ¿çšãããåºæ¬çãªåºæ¬æ©èœã«ã€ããŠã®ã¿èª¬æããŸãããã OpenCVã«ã¯ãCã¹ã¿ã€ã«ãšC ++ã¹ã¿ã€ã«ã®2ã€ã®çšéããããŸãã ã³ãŒããç°¡çŽ åããããã«ãC ++ã¹ã¿ã€ã«ïŒãŸãã¯ãOpenCvSharpãä»ãããã®ã¢ããã°ïŒã䜿çšããŸããäž»ã«2ã€ã®ã¯ã©ã¹ããããŸãïŒMatãšCv2ã ã©ã¡ããOpenCvSharp.CPlusPlusã®ããŒã ã¹ããŒã¹ã«ãããŸãã ãããã¯ç»åãã®ãã®ã§ãããCv2ã¯ç»åã«å¯Ÿããäžé£ã®ã¢ã¯ã·ã§ã³ã§ãã
æ©èœïŒ
// var mat = new Mat("test.bmp"); // mat.ImWrite("out.bmp"); // bitmap var bmp = mat.ToBitmap(); // bitmap ( OpenCvSharp.Extensions) var mat2 = new Mat(bmp.ToIplImage(), true); // using (new Window("", mat)) { Cv2.WaitKey(); } // (, ) Cv2.CvtColor(mat, dstMat, ColorConversion.RgbToGray); // Cv2.Split(mat, out mat_channels) // Cv2.Merge(mat_channels, mat) // Cv2.Absdiff(mat1, mat2, dstMat); // , / (50) (0) (255) Cv2.Threshold(mat, dstMat, 50, 255, OpenCvSharp.ThresholdType.Binary); // mat.Circle(x, y, radius, new Scalar(b, g, r)); mat.Line(x1, y1, x2, y2, new CvScalar(b, g, r)); mat.Rectangle(new Rect(x, y, width, height), new Scalar(b, g, r)); mat.Rectangle(new Rect(x, y, width, height), new Scalar(b, g, r), -1); // mat.PutText("test", new OpenCvSharp.CPlusPlus.Point(x, y), FontFace.HersheySimplex, 2, new Scalar(b, g, r))
OpenCVã«ã¯ããªããžã§ã¯ããéžæããããã®ç¹å¥ãªæ©èœïŒ æ§é åæãšåœ¢ç¶èšè¿°å ã ã¢ãŒã·ã§ã³åæãšãªããžã§ã¯ã远跡 ã ç¹åŸŽæ€åº ã ãªããžã§ã¯ãæ€åº ïŒããããŸãããããããçµãåºãããšã«æåããŸããã§ããïŒ ãšã«ããæ¬ãèªãå¿ èŠããããŸã ïŒåŸã§äœ¿ããããã«ããŠãããŸãã
ãªããžã§ã¯ããéžæ
ãªããžã§ã¯ããéžæããç°¡åãªæ¹æ³ã¯ããªããžã§ã¯ãããèæ¯ãåãé¢ãããªããžã§ã¯ããäºãã«åãé¢ããã£ã«ã¿ãŒãçºæããããšã§ãã æ®å¿µãªããããºããã£ãŒã«ãã®ç»åã¯éåžžã«ã«ã©ãã«ã§ãåçŽãªèŒåºŠã«ãããªãã¯æ©èœããŸããã 以äžã¯ãå ã®ç»åãçœé»ããŒãžã§ã³ãããã³ããŸããŸãªã«ãããªãã®ã¯ããã§ãã æåŸã®ç»åã¯ããã¹ãŠã®å Žåã«ãèæ¯ãããŒã«ãšããŒãžããããäž¡æ¹ãååšããããåæã«ååšããªãããšã瀺ããŠããŸãã


ãªããžã§ã¯ããéžæãããšããã¹ãã©ã€ãã³ã°ããå€§å¹ ã«è€éã«ãªããŸãã ããšãã°ãããã§ã¯ãCannyé¢æ°ãã©ã®ããã«åå¿ãããã瀺ãããªããžã§ã¯ãã®èŒªéã匷調ããŠããŸãã

åã ã®è²æåã䜿çšããŠããç掻ã¯è¯ããªããŸããã






移åãããªããžã§ã¯ãã匷調衚瀺ãã
移åãããªããžã§ã¯ãã匷調衚瀺ããããã®åºç€ã¯ç°¡åã§ãã2ã€ã®ãã¡ã€ã«ãæ¯èŒãããå€æŽããããã€ã³ããç®çã®ãªããžã§ã¯ãã§ãã å®éã«ã¯ããã¹ãŠãããè€éã§ãããæªéã¯ãã€ãã®ããã«è©³çŽ°ã«ãããŸã...ç»åã·ãªãŒãºã®åœ¢æ
äžé£ã®ç»åãäœæããã«ã¯ããããã«å°ããªã³ãŒããè¿œå ããŸãã ãããã¯æåŸã®ãã¬ãŒã ã®å±¥æŽãä¿æããã¹ããŒã¹ããŒãæŒããŠãã£ã¹ã¯ã«ãªã»ããããŸãã var history = new List<Bitmap>(); for (var tick = 0; ;tick++) { var bmp = GetScreenImage(gameScreenRect); history.Insert(0, bmp); const int maxHistoryLength = 10; if (history.Count > maxHistoryLength) history.RemoveRange(maxHistoryLength, history.Count - maxHistoryLength); if (Console.KeyAvailable) { var keyInfo = Console.ReadKey(); if (keyInfo.Key == ConsoleKey.Spacebar) { for (var i = 0; i < history.Count; ++i) history[i].Save(string.Format("{0}.png", i)); } [..] } [..] }
èµ·åãã¯ãªãã¯ããããŠåºæ¥äžãã-2ã€ã®ãã¬ãŒã ãæå ã«ãããŸãã


è¿é£ã®æ¯èŒ
ããç»åããå¥ã®ç»åãåŒããŸã...ãããŠããããããå±±ã«æ··ãã£ã銬ã人ã ãã ããŒã«ã¯ãå¥åŠãªããã®ã«å€ãããŸããïŒããã¯ãã«ãµã€ãºã®æçã§ã¯ã£ãããšèŠããŸãïŒã倧äžå€«ã§ããäž»ãªããšã¯ãããŒã«ãèæ¯ããåé¢ããããšãã§ãããšããããšã§ãã


ç¹å¥ã«æºåãããèæ¯ãšã®æ¯èŒ
é£æ¥ãããã¬ãŒã ã®æ¯èŒã¯ããèªç«ããã移åãªããžã§ã¯ãã«é©ããŠããŸãã åãã®æ¿ãããªããžã§ã¯ããåºå¥ããå¿ èŠãããå Žåã¯ãç¹å¥ã«æºåãããéçãªèæ¯ãšã®æ¯èŒãé©åã«æ©èœããŸãã次ã®èæ¯ãæºåããŸãã

æ¯èŒããïŒ



ã¯ããã«è¯ãã§ããã圱ã¯ãã¹ãŠãå°ç¡ãã«ããŸãã ç§ã¯è²ã ãªæ¹æ³ã§åœ±ãåãé€ãããšããŸãããã圱ã¯å®éã«ã¯æããã®å€åã§ãããšããèãã«ãã£ãŠæé«ã®å¹æãåŸãããŸãããããã¯ãã§ã«HSVã«ã©ãŒã¢ãã«ã«ã€ããŠèããããã«ãªããŸããã
Hsv

-æåã®ãã£ãã«ãHïŒè²çžïŒ-è²èª¿ã æåã®è¿äŒŒã§ã¯ãããã¯è¹ã®è²çªå·ã§ãã
-2çªç®ã®ãã£ãã«ãSïŒåœ©åºŠïŒ-圩床ã ãã®ãã£ã³ãã«ã®å€ãäœãã»ã©ãè²ãã°ã¬ãŒã«è¿ããªããè²ãã¯ã£ããããŸãã 圩床ã®é«ãè²ã¯ãå£èªã§ã¯ãé žæ§ããšåŒã°ããŠããŸãã
-3çªç®ã®ãã£ãã«ãVïŒå€ïŒ-æããã ããã¯æãç解ãããããã£ãã«ã§ãããç §åºŠã倧ããã»ã©ããã®ãã£ãã«ã®å€ã¯é«ããªããŸãã
å³åŽã®å³ã¯ããã£ã³ãã«ãšè²ã®é¢ä¿ã瀺ããŠããŸãã åã®äžã«ã¯è¹ããããŸã-ããã¯ãã£ã³ãã«Hã§ããç¹å®ã®è²ã®äžè§åœ¢ïŒçŸåšã¯èµ€ïŒã¯ããã£ã³ãã«Sã®å€å-圩床ïŒå³äžã®æ¹åïŒãšãã£ã³ãã«Vã®å€å-æããïŒå·ŠäžïŒã瀺ããŠããŸãã å€å žçã«ããã£ã³ãã«Hã®å€ã¯0-360ãS-0-100ãV-0-100ã®ç¯å²ã«ãããŸãã OpenCVã§ã¯ã1ãã€ãã®æ¬¡å ãæ倧éã«æŽ»çšããããã«ããã¹ãŠã®ãã£ãã«ã®å€ã0ã255ã®ç¯å²ã«åæžãããŸãã
RGBã«ã©ãŒã¢ãã«ã¯ã人éã®ç®ã«è¿ãé 眮ã«ãªã£ãŠããŸãã HSVã«ã©ãŒã¢ãã«ã¯ãè³ãã©ã®ããã«è²ãç¥èŠãããã«è¿ãã§ãã 以äžã§ã¯ãåãã£ã³ãã«ããã©ã¹/ãã€ãã¹50ãªãŠã ã«å€æŽãããå Žåã«äœãèµ·ãããã«ã€ããŠã®äžé£ã®ç»åãå ·äœçã«åŒçšããŸããã ãã£ã³ãã«SãšVã100åäœïŒããã³ããã¯ååã®ç¯å²ïŒã ãå€æŽããåŸã§ããç»åã¯ã»ãŒåãããã«ç¥èŠãããŸããããã£ã³ãã«Hãå°ãå€æŽããŠãç¥èŠã倧ããå€åããç»åããäžæ¯æ§ãã«ãªããŸãã ããã¯ãé·å¹Žã«ãããé²åã®éçšã§è³ãããå®å®ããããŒã¿ãå®å®æ§ã®äœãããŒã¿ããåé¢ããããšãåŠãã ãšããäºå®ã«ãããã®ã§ãã
å®å®ãšã¯ã©ãããæå³ã§ããïŒ ããã¯ãäžéšã®å€éšæ¡ä»¶ããã»ãšãã©å€åããªãæ å ±ã®äžéšã§ãã å®éã®ã¢ã€ãã ãããšãã°ç¡¬ãããŒã«ãåããŸãã ç¬èªã®è²ããããŸããããã®è²ã®ç¥èŠã¯ãç §æã空æ°ééæ§ãé£æ¥ãããªããžã§ã¯ãã®åå°ãªã©ã®å€éšæ¡ä»¶ã«å¿ããŠå€åããŸãã ãããã£ãŠãã¿ã¹ã¯ãå€éšæ¡ä»¶ã«é¢ä¿ãªãããŒã«ãå€çããéé¢ããããšã§ããå Žåãå€éšæ¡ä»¶ããã»ãšãã©å€åããªãæ å ±ã®ãã®éšåã«ãã£ãšçŠç¹ãåãããæãå€åããéšåãç¡èŠããå¿ èŠããããŸãã æãå®å®æ§ãäœãã®ã¯æããïŒãã£ã³ãã«VïŒã§ãããããã¯åœ±ã«ç§»åããåšå²ã®äžçã®æãããå€åãã空ãæããŸãã-æãããåã³å€åããŸããã 圩床ïŒãã£ã³ãã«SïŒã1æ¥ãéããŠå€åããŸããããæ£ç¢ºã«ã¯è²ã®å€åã®ç¥èŠ-ç §æãå°ãªãã»ã©ãããå€ãã®éäœ ïŒçœé»ã®èŠèŠïŒãå¯äžãã ãããããã®æ å ±ãå°ãªããªããŸãïŒè²ã®èŠèŠïŒã è²èª¿ïŒãã£ã³ãã«HïŒã¯ããªããžã§ã¯ãã®è²ãæã匱ããæãå®å®ããŠåæ ããŸãã















hsv空éã®èæ¯ãšã®æ¯èŒ
éçãªèæ¯ããã®æžç®ãç¹°ãè¿ããŸãããhsv空éãžã®å€æåŸãããïŒ å¥è·¡ïŒ ãã£ã³ãã«HãšSã§ã¯ãããŒã«ãã·ã£ããŠããæ確ã«åé¢ãããŠããããã¹ãŠã®ã·ã£ããŠã¯ã»ãŒå®å šã«ãã£ã³ãã«Vã«å ¥ããŸãããHãã£ã³ãã«ã§ã¯ãããŒã«ã®ãããŒã¿ããæ¶ããŸãããæ®å¿µãªãããé»è²ã®ããŒã«ã¯èæ¯ãšèåãå§ããŸãã ç²ãã¯Sãã£ã³ãã«ã«æ®ããŸããããã¹ãŠã®ããŒã«ãã¯ã£ãããšèŠãã2è²ç»åãžã®å€æïŒããŽããã25æªæºã«ã«ãããããŠããïŒã«ãããæ確ãªåãåŸãããäžèŠãªãã®ããã¹ãŠåé€ãããŸãã





ãŸãšã
ä»æ¥ã®ç®æšã¯éæããïŒããŒã«ã¯èæ¯ãšåœ±ããåé¢ãããŠããŸãïŒãç©ãããªéã§ç ãã«ã€ãããšãã§ããŸããPS
衚瀺ããããã¹ãŠã®ç»åã¯ãOpenCVïŒã«ããã®äžã®ã³ãŒãïŒã䜿çšããŠçæãããŸãã é衚瀺ã®ããã¹ã
var resizeK = 0.2; var dir = "Example/"; var src = new Mat("0.bmp"); var src_g = new Mat("0.bmp", LoadMode.GrayScale); var src_1 = new Mat("1.bmp"); var src_1_g = new Mat("1.bmp", LoadMode.GrayScale); var background = new Mat("background.bmp"); var background_g = new Mat("background.bmp", LoadMode.GrayScale); src.Resize(resizeK).ImWrite(dir + "0.png"); src_g.Resize(resizeK).ImWrite(dir + "0 g.png"); src_g.ThresholdStairs().Resize(resizeK).ImWrite(dir + "0 g th.png"); var canny = new Mat(); Cv2.Canny(src_g, canny, 50, 200); canny.Resize(0.5).ImWrite(dir + "0 canny.png"); Mat[] src_channels; Cv2.Split(src, out src_channels); for (var i = 0; i < src_channels.Length; ++i) { var channels = Enumerable.Range(0, src_channels.Length).Select(j => new Mat(src_channels[0].Rows, src_channels[0].Cols, src_channels[0].Type())).ToArray(); channels[i] = src_channels[i]; var dst = new Mat(); Cv2.Merge(channels, dst); dst.Resize(resizeK).ImWrite(dir + string.Format("0 ch{0}.png", i)); src_channels[i].ThresholdStairs().Resize(resizeK).ImWrite(dir + string.Format("0 ch{0} th.png", i)); } if (true) { src.Resize(0.4).ImWrite(dir + "0.png"); src_1.Resize(0.4).ImWrite(dir + "1.png"); background.Resize(0.4).ImWrite(dir + "bg.png"); var dst_01 = new Mat(); Cv2.Absdiff(src, src_1, dst_01); dst_01.Resize(resizeK).ImWrite(dir + "01.png"); dst_01.Cut(new Rect(50, src.Height * 4 / 5 - 50, src.Width / 5, src.Height / 5)).ImWrite(dir + "01 part.png"); dst_01.Cut(new Rect(50, src.Height * 4 / 5 - 50, src.Width / 5, src.Height / 5)).CvtColor(ColorConversion.RgbToGray).ImWrite(dir + "01 g.png"); dst_01.CvtColor(ColorConversion.RgbToGray).ThresholdStairs().Resize(resizeK).ImWrite(dir + "01 g th.png"); var dst_01_g = new Mat(); Cv2.Absdiff(src_g, src_1_g, dst_01_g); dst_01_g.Cut(new Rect(50, src.Height * 4 / 5 - 50, src.Width / 5, src.Height / 5)).ImWrite(dir + "0g1g.png"); dst_01_g.ThresholdStairs().Resize(resizeK).ImWrite(dir + "0g1g th.png"); } if (true) { var dst_0b = new Mat(); Cv2.Absdiff(src, background, dst_0b); dst_0b.Resize(0.6).ImWrite(dir + "0b.png"); var dst_0b_g = new Mat(); Cv2.Absdiff(src_g, background_g, dst_0b_g); dst_0b_g.Resize(0.3).ImWrite(dir + "0b g.png"); dst_0b_g.ThresholdStairs().Resize(0.3).ImWrite(dir + "0b g th.png"); } if (true) { var hsv_src = new Mat(); Cv2.CvtColor(src, hsv_src, ColorConversion.RgbToHsv); var hsv_background = new Mat(); Cv2.CvtColor(background, hsv_background, ColorConversion.RgbToHsv); var hsv_background_channels = hsv_background.Split(); var hsv_src_channels = hsv_src.Split(); if (true) { var all = new Mat(src.ToIplImage(), true); for (var i = 0; i < hsv_src_channels.Length; ++i) { hsv_src_channels[i].CvtColor(ColorConversion.GrayToRgb).CopyTo(all, new Rect(i * src.Width / 3, src.Height / 2, src.Width / 3, src.Height / 2)); } src_g.CvtColor(ColorConversion.GrayToRgb).CopyTo(all, new Rect(src.Width / 2, 0, src.Width / 2, src.Height / 2)); all.Resize(0.3).ImWrite(dir + "all.png"); } foreach (var pair in new[] { "h", "s", "v" }.Select((channel, index) => new { channel, index })) { var diff = new Mat(); Cv2.Absdiff(hsv_src_channels[pair.index], hsv_background_channels[pair.index], diff); diff.Resize(0.3).With_Title(pair.channel).ImWrite(dir + string.Format("0b {0}.png", pair.channel)); diff.ThresholdStairs().Resize(0.3).ImWrite(dir + string.Format("0b {0} th.png", pair.channel)); hsv_src_channels[pair.index].Resize(resizeK).With_Title(pair.channel).ImWrite(dir + string.Format("0 {0}.png", pair.channel)); foreach (var d in new[] { -100, -50, 50, 100 }) { var delta = new Mat(hsv_src_channels[pair.index].ToIplImage(), true); delta.Rectangle(new Rect(0, 0, delta.Width, delta.Height), new Scalar(Math.Abs(d)), -1); var new_channel = new Mat(); if (d >= 0) Cv2.Add(hsv_src_channels[pair.index], delta, new_channel); else Cv2.Subtract(hsv_src_channels[pair.index], delta, new_channel); var new_hsv = new Mat(); Cv2.Merge(hsv_src_channels.Select((channel, index) => index == pair.index ? new_channel : channel).ToArray(), new_hsv); var res = new Mat(); Cv2.CvtColor(new_hsv, res, ColorConversion.HsvToRgb); res.Resize(resizeK).With_Title(string.Format("{0} {1:+#;-#}", pair.channel, d)).ImWrite(dir + string.Format("0 {0}{1}.png", pair.channel, d)); } } } static class OpenCvHlp { public static Scalar ToScalar(this Color color) { return new Scalar(color.B, color.G, color.R); } public static void CopyTo(this Mat src, Mat dst, Rect rect) { var mask = new Mat(src.Rows, src.Cols, MatType.CV_8UC1); mask.Rectangle(rect, new Scalar(255), -1); src.CopyTo(dst, mask); } public static Mat Absdiff(this Mat src, Mat src2) { var dst = new Mat(); Cv2.Absdiff(src, src2, dst); return dst; } public static Mat CvtColor(this Mat src, ColorConversion code) { var dst = new Mat(); Cv2.CvtColor(src, dst, code); return dst; } public static Mat Threshold(this Mat src, double thresh, double maxval, ThresholdType type) { var dst = new Mat(); Cv2.Threshold(src, dst, thresh, maxval, type); return dst; } public static Mat ThresholdStairs(this Mat src) { var dst = new Mat(src.Rows, src.Cols, src.Type()); var partCount = 10; var partWidth = src.Width / partCount; for (var i = 0; i < partCount; ++i) { var th_mat = new Mat(); Cv2.Threshold(src, th_mat, 255 / 10 * (i + 1), 255, ThresholdType.Binary); th_mat.Rectangle(new Rect(0, 0, partWidth * i, src.Height), new Scalar(0), -1); th_mat.Rectangle(new Rect(partWidth * (i + 1), 0, src.Width - partWidth * (i + 1), src.Height), new Scalar(0), -1); Cv2.Add(dst, th_mat, dst); } var color_dst = new Mat(); Cv2.CvtColor(dst, color_dst, ColorConversion.GrayToRgb); for (var i = 0; i < partCount; ++i) { color_dst.Line(partWidth * i, 0, partWidth * i, src.Height, new CvScalar(50, 200, 50), thickness: 2); } return color_dst; } public static Mat With_Title(this Mat mat, string text) { var res = new Mat(mat.ToIplImage(), true); res.Rectangle(new Rect(res.Width / 2 - 10, 30, 20 + text.Length * 15, 25), new Scalar(0), -1); res.PutText(text, new OpenCvSharp.CPlusPlus.Point(res.Width / 2, 50), FontFace.HersheyComplex, 0.7, new Scalar(150, 200, 150)); return res; } public static Mat Resize(this Mat src, double k) { var dst = new Mat(); Cv2.Resize(src, dst, new OpenCvSharp.CPlusPlus.Size((int)(src.Width * k), (int)(src.Height * k))); return dst; } public static Mat Cut(this Mat src, Rect rect) { return new Mat(src, rect); } public static Mat[] Split(this Mat hsv_background) { Mat[] hsv_background_channels; Cv2.Split(hsv_background, out hsv_background_channels); return hsv_background_channels; } }
DirectXã¢ãŒã±ãŒãçšã®ãããã éšåçªå·1ïŒé£çµ¡ãã
ã¢ãŒã±ãŒãçšã®ãããã éšåçªå·2ïŒOpenCVãæ¥ç¶ããŸã