{"id":665,"date":"2021-11-06T11:00:53","date_gmt":"2021-11-06T02:00:53","guid":{"rendered":"https:\/\/rfsec.ddns.net\/db\/?p=665"},"modified":"2021-11-14T23:44:45","modified_gmt":"2021-11-14T14:44:45","slug":"atomcam2%e3%81%ae%e7%94%bb%e5%83%8f%e3%81%8b%e3%82%89%e6%b5%81%e6%98%9f%e3%82%92%e9%8c%b2%e7%94%bb","status":"publish","type":"post","link":"https:\/\/rfsec.ddns.net\/db\/?p=665","title":{"rendered":"ATOMcam2\u306e\u753b\u50cf\u304b\u3089\u6d41\u661f\u3092\u9332\u753b"},"content":{"rendered":"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"590\" height=\"579\" src=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/11\/ATOMcam2.png\" alt=\"\" class=\"wp-image-666\" srcset=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/11\/ATOMcam2.png 590w, https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/11\/ATOMcam2-300x294.png 300w\" sizes=\"auto, (max-width: 590px) 100vw, 590px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-preformatted\">ATOMcam2\u3092\u30d9\u30e9\u30f3\u30c0\u3078\u8a2d\u7f6e\u3057\u3001RTSP\n\u3067\u753b\u50cf\u3092\u6d41\u3059\u3002<\/pre>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/rfsec.ddns.net\/db\/wp-content\/uploads\/2021\/11\/metro2.mp4\"><\/video><figcaption>\u5c0f\u898f\u6a21\u306a\u706b\u7403\u3092\u30ad\u30e3\u30c3\u30c1\uff08\u5de6\u4e0a\uff09\u3002\u52d5\u753b\u3092\u62e1\u5927\u3059\u308b\u3068\u3001\u753b\u9762\u4e0a\u90e8\u4e2d\u592e\u306b\u3001\u304a\u304a\u3050\u307e\u5ea7\uff08\u5317\u6597\u4e03\u661f\uff09\u306e\u4e00\u90e8\u304c\u5199\u3063\u3066\u3044\u308b\u3002<\/figcaption><\/figure>\n\n\n\n<p>\u51e6\u7406\u306f\u3001Python(jupyter notebook)\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3002cv2\u306e\u4e2d\u306e\u79fb\u52d5\u691c\u77e5\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u3002\u6d41\u661f\u306e\u4ed6\u306b\u3001\u822a\u7a7a\u6a5f\u3001\u4eba\u5de5\u885b\u661f\u3001\u79fb\u52d5\u304c\u6fc0\u3057\u3044\u96f2\u3001\u9ce5\u306a\u3069\u3082\u8a18\u9332\u3055\u308c\u308b\u306e\u3067\u3001\u4f55\u3089\u304b\u306e\u65b9\u6cd5\u3067\u3001\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3057\u305f\u3044\u3002<\/p>\n\n\n\n<p>\u3068\u308a\u3042\u3048\u305a\u3001\u4e00\u5b9a\u306e\u30b5\u30a4\u30ba\u4ee5\u4e0b\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3059\u308b\u30b9\u30af\u30ea\u30d7\u30c8(500kB\u306e\u4f8b\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>find . -name &quot;*.avi&quot; -type &#39;f&#39; -size -500k -delete<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import cv2\nimport numpy as np\nimport time\nimport datetime\nimport os\n\ncapture = cv2.VideoCapture(&#39;rtsp:\/\/4190:2712@192.168.68.74\/live&#39;)\n#capture=cv2.VideoCapture(0)\nPATH=&quot;\/media\/mars\/ff2880cc-1a99-40bd-88c1-5cdc86fe9eed\/home\/mars\/DATA&quot;\nW = capture.get(cv2.CAP_PROP_FRAME_WIDTH)\nH = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)\nW2=int(W\/2)\nH2=int(H\/2)\nfourcc = cv2.VideoWriter_fourcc(*&quot;XVID&quot;)\nprint(W,H)\n\ndef key(k):\n    global th, tc,track,reverse\n    if k == ord(&#39;2&#39;):\n        th = th - 1\n    elif k == ord(&#39;3&#39;):\n        th = th + 1\n    elif k == ord(&#39;4&#39;):\n        tc = tc -5\n    elif k == ord(&#39;5&#39;):\n        tc = tc +5\n    elif k == ord(&#39;t&#39;):\n        track = not track\n    elif k == ord(&#39;r&#39;):\n        reverse = not reverse\n\nfontFace =cv2.FONT_HERSHEY_SIMPLEX\ntrack, reverse = False,False\navg=None\nth = 10\ntc = 25\nx,y=0,0\nwriter = None\ntime_start = time.time()\nframe=0\nwhile(True):\n    ret, img = capture.read()\n    org = img.copy()\n    #img = cv2.resize(im, dsize=(W2, H2))\n    img=img[0:int(H*0.9),0:int(W)]    # \u6620\u50cf\u306e\u4e0b\u507410%\u3092\u691c\u77e5\u7bc4\u56f2\u304b\u3089\u9664\u5916\u3002\n    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n    if reverse:\n        gray=cv2.bitwise_not(gray)\n        avg=cv2.bitwise_not(avg)\n    if avg is None:\n        avg = gray.copy().astype(&quot;float&quot;)\n        continue\n\n    cv2.accumulateWeighted(gray, avg, 0.5)\n    frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))\n    thresh = cv2.threshold(frameDelta, th, 255, cv2.THRESH_BINARY)[1]\n    contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n    detect=False\n    for i in range(0,len(contours)):\n        if len(contours[i]) &gt; 0:\n             if cv2.contourArea(contours[i]) &gt; tc:\n                detect=True\n                time_start = time.time()\n                if writer is None and track:\n                    now=datetime.datetime.today()\n                    date=now.strftime(&quot;%Y%m%d&quot;)\n                    cDIR=PATH+&#39;\/&#39;+date\n                    if not(os.path.exists(cDIR)):\n                           os.mkdir(cDIR)\n                    fname=cDIR+&#39;\/&#39;+&#39;E-&#39;+now.strftime(&quot;%Y%m%d_%H:%M:%S&quot;)+&quot;.avi&quot;\n                    writer = cv2.VideoWriter(fname, fourcc, 15, (int(W), int(H)))\n                rect = contours[i]\n                x, y, w, h = cv2.boundingRect(rect)\n\n                cv2.rectangle(img, (x-w, y-h), (x + w*2, y + h*2), (0, 0, 255), 2)\n                \n    if time.time() -  time_start  &gt; 5:\n        if writer is not None:\n            writer.release()\n            #f.close()\n            frame=0\n            writer = None\n    now=datetime.datetime.today()    \n    text=now.strftime(&quot;%Y\/%m\/%d %H:%M:%S&quot;)+&#39; No:&#39;+str(frame)+ &#39; &#39;+&quot; TH:&quot;+str(th)+&quot; SZ:&quot;+str(tc)\n    img = cv2.putText(img, text, (30,50), fontFace,1,color=(0, 255, 0))\n    org = cv2.putText(org, text, (30,50), fontFace,1,color=(0, 255, 0))\n    text1=&quot;REC:&quot;+str(track) + &quot;  reverse:&quot; + str(reverse)\n    if writer is not None:\n        frame=frame+1\n        text1=fname+&#39; &#39;+text1\n    img = cv2.putText(img, text1, (30,80), fontFace,1,color=(0, 255, 0))\n    #cv2.imshow(&#39;thresh-level&#39;,thresh)\n    cv2.imshow(&quot;IMAGE&quot;,img)\n    if writer is not None:\n        writer.write(org)\n        \n    k=cv2.waitKey(1) & 0xFF\n    key(k)\n    if k== ord(&#39;q&#39;):\n        break\n\ncapture.release()\nif writer is not None:\n    writer.release()\ncv2.destroyAllWindows()<\/code><\/pre><\/div>\n\n\n\n<p>Thread\u6a5f\u80fd\u3092\u5229\u7528\u3057\u3066\u3001\u51e6\u7406\u306e\u52b9\u7387\u5316\u3092\u56f3\u308b\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import cv2\nimport threading\nimport queue\nimport numpy as np\nimport time\nimport datetime\nimport os\n\ncPATH=&#39;rtsp:\/\/4190:2712@192.168.68.74\/live&#39;\n#cPATH= &#39;rtsp:\/\/admin:@192.168.68.128:554\/1\/h264major&#39;\nPATH=&quot;\/home\/pi\/DATA&quot;\n\nfourcc = cv2.VideoWriter_fourcc(*&quot;XVID&quot;)\n\nclass ThreadingVideoCapture:\n    def __init__(self, src, max_queue_size=256):\n        self.video = cv2.VideoCapture(src)\n        self.q = queue.Queue(maxsize=max_queue_size)\n        self.stopped = False\n\n    def start(self):\n        thread = threading.Thread(target=self.update, daemon=True)\n        thread.start()\n        return self\n\n    def update(self):\n        while True:\n            if self.stopped:\n                return\n            if not self.q.full():\n                ok, frame = self.video.read()\n                self.q.put((ok, frame))\n                if not ok:\n                    self.stop()\n                    return\n\n    def read(self):\n        return self.q.get()\n\n    def stop(self):\n        self.stopped = True\n\n    def release(self):\n        self.stopped = True\n        self.video.release()\n\n    def isOpened(self):\n        return self.video.isOpened()\n\n    def get(self, i):\n        return self.video.get(i)\n    \ndef key(k):\n    global th, tc,track,reverse,disp\n    if k == ord(&#39;2&#39;):\n        th = th - 1\n    elif k == ord(&#39;3&#39;):\n        th = th + 1\n    elif k == ord(&#39;4&#39;):\n        tc = tc -5\n    elif k == ord(&#39;5&#39;):\n        tc = tc +5\n    elif k == ord(&#39;t&#39;):\n        track = not track\n    elif k == ord(&#39;d&#39;):\n        disp= not disp\n    elif k == ord(&#39;r&#39;):\n        reverse = not reverse\n\ndef detect_mov(contours,detect):\n    for i in range(0,len(contours)):\n            if len(contours[i]) &gt; 0:\n                 if cv2.contourArea(contours[i]) &gt; tc:\n                    detect=detect+1\n                    rect = contours[i]\n                    x, y, w, h = cv2.boundingRect(rect)\n                    cv2.rectangle(img, (x-w, y-h), (x + w*2, y + h*2), (0, 0, 255), 3)\n    return img,detect\n                    \nfontFace =cv2.FONT_HERSHEY_SIMPLEX\n\nvideo = ThreadingVideoCapture(cPATH)\nvideo.start()\nif not video.isOpened():\n    raise RuntimeError\n\nW = video.get(cv2.CAP_PROP_FRAME_WIDTH)\nH = video.get(cv2.CAP_PROP_FRAME_HEIGHT)\nW2,H2=int(W\/2),int(H\/2)\ncv2.namedWindow(&#39;ATOM&#39;, cv2.WINDOW_AUTOSIZE)\n\ntrack, reverse,disp = False,False,False\navg=None\nth = 10\ntc = 25\nx,y=0,0\nwriter = None\ntime_start = time.time()\nframe=0\nfname=None\nlog=PATH+&#39;\/metro.log&#39;\ndetect=0\nwhile(True):\n    ret, img = video.read()\n    if ret:\n        org = img.copy()\n        img = cv2.resize(img, dsize=(W2,H2))\n        img=img[0:int(H2*0.85),0:int(W2)]\n        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n        if reverse:\n            gray=cv2.bitwise_not(gray)\n            avg=cv2.bitwise_not(avg)\n        if avg is None:\n            avg = gray.copy().astype(&quot;float&quot;)\n            continue\n\n        cv2.accumulateWeighted(gray, avg, 0.5)\n        frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))\n        thresh = cv2.threshold(frameDelta, th, 255, cv2.THRESH_BINARY)[1]\n\n        contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n        img,detect=detect_mov(contours,detect)\n        if writer is None and track and detect !=0:\n            time_start = time.time()\n            now=datetime.datetime.today()\n            date=now.strftime(&quot;%Y%m%d&quot;)\n            cDIR=PATH+&#39;\/&#39;+date\n            if not(os.path.exists(cDIR)):\n                os.mkdir(cDIR)\n            fname=cDIR+&#39;\/&#39;+&#39;E-&#39;+now .strftime(&quot;%Y%m%d_%H%M%S&quot;)+&quot;.avi&quot;\n            writer = cv2.VideoWriter(fname, fourcc, 15, (int(W), int(H)))\n            \n        if time.time() -  time_start  &gt; 5:\n            if writer is not None:\n                writer.release()\n                #f.close()\n                frame=0\n                writer = None\n        now=datetime.datetime.today()    \n        text=now.strftime(&quot;%Y%m%d %H%M%S&quot;)+&#39; No:&#39;+str(frame)+ &#39; &#39;+&quot; TH:&quot;+str(th)+&quot; SZ:&quot;+str(tc)\n        img = cv2.putText(img, text, (30,50), fontFace,1,color=(0, 255, 0))\n        org = cv2.putText(org, text, (30,50), fontFace,1,color=(0, 255, 0))\n        text1=&quot;REC:&quot;+str(track) + &quot;  reverse:&quot; + str(reverse)\n        if writer is not None:\n            frame=frame+1\n            text1=fname+&#39; &#39;+text1\n        img = cv2.putText(img, text1, (30,80), fontFace,1,color=(0, 255, 0))\n        #cv2.imshow(&#39;thresh-level&#39;,thresh)\n        if disp:\n            cv2.imshow(&quot;ATOM&quot;,img)\n        \n        if writer is not None:\n            writer.write(org)\n    else:\n        now=datetime.datetime.today()\n        date=now.strftime(&quot;%Y%m%d_%H%M%S&quot;)\n        print(&quot;disconected:&quot;,date)\n        video.release()\n        avg = None\n        video = ThreadingVideoCapture(cPATH)\n        video.start()\n    k=cv2.waitKey(int(1000 \/ 30)) & 0xFF\n    key(k)\n    if k== ord(&#39;q&#39;):\n        break\n\nvideo.release()\nif writer is not None:\n    writer.release()\ncv2.destroyAllWindows()\nprint(&#39;Done.&#39;)<\/code><\/pre><\/div>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ATOMcam2\u3092\u30d9\u30e9\u30f3\u30c0\u3078\u8a2d\u7f6e\u3057\u3001RTSP \u3067\u753b\u50cf\u3092\u6d41\u3059\u3002 \u51e6\u7406\u306f\u3001Python(jupyter notebook)\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3002cv2\u306e\u4e2d\u306e\u79fb\u52d5\u691c\u77e5\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u3002\u6d41\u661f\u306e\u4ed6\u306b\u3001\u822a\u7a7a\u6a5f\u3001\u4eba\u5de5\u885b\u661f\u3001\u79fb\u52d5\u304c\u6fc0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,7],"tags":[],"class_list":["post-665","post","type-post","status-publish","format-standard","hentry","category-camera","category-astronomy"],"featured_image_src":null,"author_info":{"display_name":"mars","author_link":"https:\/\/rfsec.ddns.net\/db\/?author=1"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/665","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=665"}],"version-history":[{"count":11,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/665\/revisions"}],"predecessor-version":[{"id":708,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/665\/revisions\/708"}],"wp:attachment":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=665"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}