{"id":5283,"date":"2021-04-11T09:58:36","date_gmt":"2021-04-11T00:58:36","guid":{"rendered":"https:\/\/kats-eye.net\/info\/?p=5283"},"modified":"2021-04-11T10:00:02","modified_gmt":"2021-04-11T01:00:02","slug":"image-watch2","status":"publish","type":"post","link":"https:\/\/kats-eye.net\/info\/2021\/04\/11\/image-watch2\/","title":{"rendered":"Python\u3068OPENCV\u3092\u4f7f\u3063\u3066\u3001\u79d2\u91dd\u3092\u8aad\u3080\uff08\uff12\uff09"},"content":{"rendered":"\n<h2>\u51e6\u7406\u6982\u8981<\/h2>\n\n\n\n<p>\u3000\u5148\u56de\u306e\u6295\u7a3f\u3067\u3082\u3001PYTHON\u3068OPENCV\u3092\u4f7f\u3063\u3066\u79d2\u91dd\u3092\u8aad\u307f\u307e\u3057\u305f\u304c\u3001\u4eca\u56de\u306f\u51e6\u7406\u30ed\u30b8\u30c3\u30af\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059\u3002<br>\u3000\u8003\u3048\u65b9\u306f\u3001\u4e0b\u56f3\u306e\u901a\u308a\uff12\u5024\u5316\u51e6\u7406\u3057\u305f\u30b9\u30c8\u30c3\u30d7\u30a6\u30a9\u30c3\u30c1\u753b\u50cf\uff08\u5de6\uff09\u3068\u30de\u30b9\u30af\u753b\u50cf\uff08\u4e2d\u592e\uff09\u3092\u30a2\u30f3\u30c9\u51e6\u7406\u30fb\u81a8\u5f35\u51e6\u7406\u3059\u308b\u3068\u4e0b\u56f3\u53f3\u306e\u69d8\u306b\u79d2\u91dd\u90e8\u306e\u307f\u306e\u753b\u50cf\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\u3002\u53d6\u5f97\u3057\u305f\u79d2\u91dd\u90e8\u306e\u91cd\u5fc3\u5ea7\u6a19\u3068\u56de\u8ee2\u8ef8\u4e2d\u5fc3\u5ea7\u6a19\u304b\u3089\u79d2\u91dd\u306e\u50be\u304d\u3092\u6c42\u3081\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\u3002\u3053\u306e\u50be\u304d\u304b\u3089\u66f4\u306b\u76ee\u76db\uff08\u79d2\uff09\u306e\u5024\u3092\u8a08\u7b97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"1024\" height=\"365\" src=\"https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_flow-1024x365.png\" alt=\"\" class=\"wp-image-5290\" srcset=\"https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_flow-1024x365.png 1024w, https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_flow-300x107.png 300w, https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_flow-768x273.png 768w, https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_flow.png 1208w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>\u3000\u3000<\/figcaption><\/figure><\/div>\n\n\n\n<p>\u3000\u4e0b\u306e\u53f3\u4e0a\u56f3\u306f\u79d2\u91dd\u90e8\u306e\u91cd\u5fc3\u5ea7\u6a19\u3068\u56de\u8ee2\u8ef8\u4e2d\u5fc3\u5ea7\u6a19\u3092\u8d64\u3044\u76f4\u7dda\u3067\u3064\u306a\u3044\u3067\u3044\u307e\u3059\u3002\u3053\u306e\u76f4\u7dda\u306e\u50be\u304d\u304b\u3089\u7d4c\u904e\u6642\u9593\u3092\u8a08\u7b97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"742\" height=\"690\" src=\"https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_55-1.png\" alt=\"\" class=\"wp-image-5289\" srcset=\"https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_55-1.png 742w, https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/B_55-1-300x279.png 300w\" sizes=\"(max-width: 742px) 100vw, 742px\" \/><figcaption><br><\/figcaption><\/figure><\/div>\n\n\n\n<h2>\u79d2\u91dd\u89e3\u6790\u72b6\u6cc1\u52d5\u753b<\/h2>\n\n\n\n<p>\u3000\u89e3\u6790\u72b6\u6cc1\u306e\u52d5\u753b\u3067\u3059\u3002\uff14\u500d\u901f\u518d\u751f\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/kats-eye.net\/info\/wp-content\/uploads\/2021\/04\/20210411_count_meter.mp4\"><\/video><figcaption><br><\/figcaption><\/figure>\n\n\n\n<h2>\u30d7\u30ed\u30b0\u30e9\u30e0\uff08python+OpenCV\uff09<\/h2>\n\n\n\n<p>\u3000\u30d7\u30ed\u30b0\u30e9\u30e0\u30b3\u30fc\u30c9\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-file=\"GetStopWatchInf_Hen1.py\" data-lang=\"Python\"><code>from pypylon import pylon\nimport cv2\nimport numpy as np\nimport time\nimport math\n\n# conecting to the first available camera\ncamera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())\n\n# Grabing Continusely (video) with minimal delay\ncamera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly) \nconverter = pylon.ImageFormatConverter()\n\n# converting to opencv bgr format\nconverter.OutputPixelFormat = pylon.PixelType_BGR8packed\nconverter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned\n\nP_LU=[120,108]              # [\u5de6\u4e0a]\u3000\u5c04\u5f71\u5909\u63db[X,Y]\nP_RU=[918,91]               # [\u53f3\u4e0a]\u3000\u5c04\u5f71\u5909\u63db[X,Y]\nP_RD=[933,1827]             # [\u53f3\u4e0b]  \u5c04\u5f71\u5909\u63db[X,Y]\nP_LD=[133,1830]             # [\u5de6\u4e0b]  \u5c04\u5f71\u5909\u63db[X,Y]\n\n#\u643a\u5e2f\u30b5\u30a4\u30ba\u300073.4 X 155.2\ndst_w=721                   # WINDOW\u5e45\ndst_h=1552                  # WINDOW\u9ad8\u3055 \n\ncnt_w=round(dst_w\/2)-4      # \u6642\u8a08\u4e2d\u5fc3\uff08X\uff09\ncnt_h=457                   # \u6642\u8a08\u4e2d\u5fc3\uff08Y\uff09\ncnt_r=280                   # \u5207\u308a\u53d6\u308a\u9818\u57df\n\nscale = 1.0                 # \u30b9\u30b1\u30fc\u30eb\u3092\u6307\u5b9a\nctr_rot = (cnt_r, cnt_r)    # \u56de\u8ee2\u4e2d\u5fc3\n\nthreshold = 140             # \u4e8c\u5024\u5316\u95be\u5024\nangle = 0\npixel_thrsh = 100           # \u79d2\u91dd\u3068\u30c1\u30a7\u30c3\u30af\u77e9\u5f62\u67a0\u306e\u91cd\u306a\u308b\u30d4\u30af\u30bb\u30eb\u6570\n\n\nwhile camera.IsGrabbing():\n    grabResult = camera.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)\n\n    if grabResult.GrabSucceeded():\n        # Access the image data\n        image = converter.Convert(grabResult)\n        img = image.GetArray()\n\n        # \u753b\u50cf\u306e\u5927\u304d\u3055\u3092\u53d6\u5f97\n        height, width, channels = img.shape[:3]\n\n        # \u5bfe\u8c61\u30b5\u30a4\u30ba\u7a0b\u5ea6\u306b\u30af\u30ed\u30c3\u30d7\u30fb\u30ea\u30b5\u30a4\u30ba\n        img1 = img[5 : 1905, round(width\/2) - 550 : round(width\/2) + 550 ]\n        hgt1, wdt1, chnls1 = img1.shape[:3]\n\n        pts = np.array([P_LU,P_RU,P_RD,P_LD])\n        pts = pts.reshape((-1,1,2))\n        cv2.polylines(img1,[pts],True,(0,0,255),2)\n        img1_resize = cv2.resize(img1, (int(1100*1120\/1900),1120))\n\n        # \u5c04\u5f71\u5909\u63db\n        pts_src = np.float32([ P_LU , P_RU , P_LD , P_RD ])\n        pts_dst = np.float32([[0,0],[dst_w,0],[0,dst_h],[dst_w,dst_h]])\n        M = cv2.getPerspectiveTransform( pts_src , pts_dst )\n        img_trn = cv2.warpPerspective( img1 , M , ( dst_w , dst_h ))\n\n        # \u6642\u8a08\u90e8 \u6b63\u65b9\u5f62\u9818\u57df\u3092\u30af\u30ed\u30c3\u30d7\n        img_wch = img_trn[ cnt_h - cnt_r : cnt_h + cnt_r , cnt_w - cnt_r : cnt_w + cnt_r ]\n        img_gray = cv2.cvtColor(img_wch, cv2.COLOR_BGR2GRAY)                            \n        ret,img_thrsh = cv2.threshold(img_gray , threshold , 255 , cv2.THRESH_BINARY)\n\n        cv2.circle(img_wch, (cnt_r, cnt_r), 12, (0, 0, 255), thickness=2)\n        cv2.circle(img_wch, (cnt_r, cnt_r), 268, (0, 0, 255), thickness=2)\n\n\n        # \u30de\u30b9\u30af\u4f5c\u6210 (\u9ed2(\uff10)\u306b\u5857\u308a\u6f70\u3057\u3001\u53cd\u8ee2\u3057\u767d\uff08\uff11\uff09\u306b\u3059\u308b)\n        h, w = img_thrsh.shape[:2]\n        mask = cv2.bitwise_not(np.zeros((h, w), dtype=np.uint8))\n        cv2.circle(mask, center=(cnt_r, cnt_r), radius=165, color=0, thickness=-1)\n        cv2.circle(mask, center=(cnt_r, cnt_r), radius=115, color=255, thickness=-1)\n\n        img_dst = cv2.bitwise_or(img_thrsh, mask)                       # \u30de\u30b9\u30af\u51e6\u7406\u2192\u300c\u79d2\u91dd\u300d\u90e8\u62bd\u51fa\n\n        kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (11, 11))\n        img_dst = cv2.bitwise_not(cv2.erode(img_dst, kernel))           # \u53ce\u7e2e\u51e6\u7406\n        mu = cv2.moments(img_dst, False)                                # \u91cd\u5fc3\u8a08\u7b97\n        x,y= int(mu[&quot;m10&quot;]\/mu[&quot;m00&quot;]) , int(mu[&quot;m01&quot;]\/mu[&quot;m00&quot;])        # \u91cd\u5fc3\u8a08\u7b97\n        res_ang = math.degrees(math.atan2( y - cnt_r , x - cnt_r ))     # \u89d2\u5ea6\u8a08\u7b97\n\n        # \u79d2\u91dd\uff10\u79d2\u4f4d\u7f6e\u304b\u3089\u306e\u89d2\u5ea6\u306b\u5909\u63db\n        if res_ang &gt;= -90 :\n            res_ang = res_ang + 90\n        else:\n            res_ang = res_ang + 450\n            \n        sec_trs= round( 60 * res_ang \/ 360)                             # \u89d2\u5ea6\u3092\u79d2\u5909\u63db\n\n        # \u4e8c\u5024\u5316\u753b\u50cf\u3092\u30ab\u30e9\u30fc\u753b\u50cf\u5909\u63db\u3001\u79d2\u91dd\u90e8\u7b49\u306e\u8a08\u6e2c\u60c5\u5831\u63cf\u753b\n        img_dst_rgb = cv2.cvtColor(img_dst,cv2.COLOR_GRAY2RGB) \n        cv2.circle(img_dst_rgb, (cnt_r, cnt_r), 12, (0, 0, 255), thickness=2)\n        cv2.putText(img_dst_rgb, &quot;(&quot; + str(x) + &quot;,&quot; + str(y) + &quot;)&quot; , (200, 50), cv2.FONT_HERSHEY_PLAIN, 3,(255, 255, 255), 2, cv2.LINE_AA)\n        cv2.putText(img_dst_rgb, &quot;&quot; + str(int(res_ang)) + &quot;deg&quot; + &quot;&quot; , (10, 50), cv2.FONT_HERSHEY_PLAIN, 3,(255, 255, 255), 2, cv2.LINE_AA)\n        cv2.putText(img_dst_rgb, &quot;&quot; + str(int(sec_trs)) + &quot;sec&quot; + &quot;&quot; , (10, 90), cv2.FONT_HERSHEY_PLAIN, 3,(255, 255, 255), 2, cv2.LINE_AA)\n        cv2.line(img_dst_rgb, ctr_rot , (x, y), (0, 0, 255), thickness=3 , lineType = cv2.LINE_4 )\n        cv2.circle(img_dst_rgb, (cnt_r, cnt_r), 190, (255, 255, 255), thickness=2)\n        \n        # \u7d50\u679c\u8868\u793a\n        img_mrg1 = cv2.vconcat([img_dst_rgb , img_wch])                 # \uff12\u753b\u50cf\u3092\u7e26\u9023\u7d50\n        img_mrg2 = cv2.hconcat([img1_resize, img_mrg1])                 # \uff12\u753b\u50cf\u3092\u7e26\u9023\u7d50\n        cv2.putText(img_mrg2, &quot;&quot; + str(sec_trs)+&quot;sec&quot;, (250, 670), cv2.FONT_HERSHEY_PLAIN, 5,(0, 0, 255), 3, cv2.LINE_AA)\n\n        cv2.namedWindow(&#39;img_mrg&#39;, cv2.WINDOW_NORMAL)\n        cv2.imshow(&#39;img_mrg&#39;, img_mrg2)\n\n\n        img_mrg3 = cv2.hconcat([img_thrsh, mask,img_dst])               # \u753b\u50cf\u3092\u7e26\u9023\u7d50\n        cv2.line(img_mrg3, (w,0) , (w, h), (0, 0, 0), thickness=2 , lineType = cv2.LINE_4 )\n        cv2.namedWindow(&#39;img_mrg3&#39;, cv2.WINDOW_NORMAL)\n        cv2.imshow(&#39;img_mrg3&#39;, img_mrg3)\n\n        time.sleep(0.1)\n        \n        k = cv2.waitKey(1)\n        if k == 27:\n            break\n    grabResult.Release()\n    \n# Releasing the resource    \ncamera.StopGrabbing()\n\ncv2.destroyAllWindows()<\/code><\/pre><\/div>\n\n\n\n<h2>\u307e\u3068\u3081<\/h2>\n\n\n\n<p>\u3000\u79c1\u306e\u5b66\u7fd2\u30dd\u30a4\u30f3\u30c8\u306f\u5186\u5f62\u30de\u30b9\u30af\u306e\u5f62\u6210\u3067\u3059\u3002\u5148\u56de\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3088\u308a\u30b7\u30f3\u30d7\u30eb\u306b\u306a\u3063\u305f\u69d8\u306b\u601d\u3044\u307e\u3059\u3002<br>\u3000\u3042\u3068\u3001\u30ab\u30e1\u30e9\u3068\u6642\u8a08\u306e\u4f4d\u7f6e\u6c7a\u3081\u3084\u660e\u308b\u3055\u306e\u5909\u5316\u306b\u5bfe\u5fdc\u3067\u304d\u308b\u3068\u3088\u3044\u306e\u3067\u3059\u304c\u30fb\u30fb\u30fb\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u51e6\u7406\u6982\u8981 \u3000\u5148\u56de\u306e\u6295\u7a3f\u3067\u3082\u3001PYTHON\u3068OPENCV\u3092\u4f7f\u3063\u3066\u79d2\u91dd\u3092\u8aad\u307f\u307e\u3057\u305f\u304c\u3001\u4eca\u56de\u306f\u51e6\u7406\u30ed\u30b8\u30c3\u30af\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059\u3002\u3000\u8003\u3048\u65b9\u306f\u3001\u4e0b\u56f3\u306e\u901a\u308a\uff12\u5024\u5316\u51e6\u7406\u3057\u305f\u30b9\u30c8\u30c3\u30d7\u30a6\u30a9\u30c3\u30c1\u753b\u50cf\uff08\u5de6\uff09\u3068\u30de\u30b9\u30af\u753b\u50cf\uff08\u4e2d\u592e\uff09\u3092\u30a2\u30f3\u30c9\u51e6\u7406\u30fb\u81a8\u5f35\u51e6 &hellip; <a href=\"https:\/\/kats-eye.net\/info\/2021\/04\/11\/image-watch2\/\" class=\"more-link\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"screen-reader-text\">Python\u3068OPENCV\u3092\u4f7f\u3063\u3066\u3001\u79d2\u91dd\u3092\u8aad\u3080\uff08\uff12\uff09<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":5284,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[75],"tags":[153,119,116],"_links":{"self":[{"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/posts\/5283"}],"collection":[{"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/comments?post=5283"}],"version-history":[{"count":14,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/posts\/5283\/revisions"}],"predecessor-version":[{"id":5307,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/posts\/5283\/revisions\/5307"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/media\/5284"}],"wp:attachment":[{"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/media?parent=5283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/categories?post=5283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kats-eye.net\/info\/wp-json\/wp\/v2\/tags?post=5283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}