{"id":709,"date":"2021-11-15T20:31:03","date_gmt":"2021-11-15T11:31:03","guid":{"rendered":"https:\/\/rfsec.ddns.net\/db\/?p=709"},"modified":"2021-11-18T11:43:01","modified_gmt":"2021-11-18T02:43:01","slug":"cuda%e3%81%a8thread%e5%af%be%e5%bf%9c%e3%81%ae%e3%83%86%e3%82%b9%e3%83%88","status":"publish","type":"post","link":"https:\/\/rfsec.ddns.net\/db\/?p=709","title":{"rendered":"cuda\u3068Thread\u5bfe\u5fdc\u306e\u30c6\u30b9\u30c8"},"content":{"rendered":"\n<p>\u8907\u6570\u53f0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30ab\u30e1\u30e9\u306b\u5bfe\u5fdc\u3057\u3001cuda(GPU)\u3068Thread\u6a5f\u80fd\u3092\u6d3b\u7528\u3067\u304d\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u3002<\/p>\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\nimport sys\nGPU=True\nTHREAD=True\nif len(sys.argv)&gt;1:\n    if sys.argv[1]==&#39;A&#39;:\n        cPATH=&#39;rtsp:\/\/5173:6703@192.168.68.74\/live&#39;\n    else:\n        cPATH=&#39;rtsp:\/\/admin:@192.168.68.128:554\/1\/h264major&#39;\nelse:\n        cPATH=&#39;rtsp:\/\/5173:6703@192.168.68.74\/live&#39;\nPATH=&quot;\/home\/mars\/pWork\/DATA&quot;\n#\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\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\nwriter = None\nth = 30\ntc = 30\nx,y=0,0\ndetect_counts = 0\nred,blue,green = (0,0,255),(255,0,0),(0,255,0)\ntime_start = time.time()\nframe=0\nlog=PATH+&#39;\/metro.log&#39;\nif cPATH==&#39;rtsp:\/\/5173:6703@192.168.68.74\/live&#39;:\n    TITLE=&quot;ATOM&quot;\n    HEAD =&#39;ATOM&#39;\nelse:\n    TITLE=&quot;ONVIF&quot;\n    HEAD=&#39;ONVIF&#39;\n\nif THREAD:\n    import threading\n    import queue\n    TITLE=TITLE+&quot;-T&quot;\n    capture = ThreadingVideoCapture(cPATH)\n    capture.start()\n    if not capture.isOpened():\n        raise RuntimeError\nelse:\n    capture=cv2.VideoCapture(cPATH)\n\nif GPU:\n    TITLE=TITLE+&quot;-G&quot;\n    img_gpu_src = cv2.cuda_GpuMat() # Allocate device memory only once, as memory allocation seems to take time...\n    img_gpu_dst = cv2.cuda_GpuMat()\n    img_gpu_gray= cv2.cuda_GpuMat()\n\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(&#39;Camera:&#39;,cPATH)\nprint(&#39;Size:&#39;,W,H)\nwhile(True):\n    ret, img = capture.read()\n    if ret:\n        org = img.copy()\n        if GPU:\n            img_gpu_src.upload(img)\n            img_gpu_dst = cv2.cuda.resize(img_gpu_src, dsize=(W2, H2))\n            img_gpu_dst = cv2.cuda_GpuMat(img_gpu_dst,[0,int(H2*0.85)],[0,W2])\n            img_gpu_gray=cv2.cuda.cvtColor(img_gpu_dst,cv2.COLOR_BGR2GRAY)\n            org_img=img_gpu_dst.download()\n            gray = img_gpu_gray.download()\n        else:\n            org_img = cv2.resize(img, dsize=(W2, H2))\n            org_img=img[0:int(H2*0.85),0:W2]\n            gray = cv2.cvtColor(org_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        #wtiter,fname = moving(img,avg)\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        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                        detect_counts = 0\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;+ HEAD + 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                    cv2.rectangle(org_img, (x-w, y-h), (x + w*2, y + h*2), red, 3)\n        if detect:\n            detect_counts=detect_counts + 1\n        if time.time() -  time_start  &gt; 5:\n            if writer is not None:\n                writer.release()\n                new_name=fname.replace(HEAD,HEAD+&#39;_&#39; + f&#39;{detect_counts:04}&#39;+&#39;_&#39;)\n                os.rename(fname,new_name)\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        org_img = cv2.putText(org_img, text, (30,50), fontFace,1,color=green)\n        org = cv2.putText(org, text, (30,50), fontFace,1,color=green)\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        org_img = cv2.putText(org_img, text1, (30,80), fontFace,1,color=green)\n        #cv2.imshow(&#39;thresh-level&#39;,thresh)\n\n        cv2.imshow(TITLE,org_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(&#39;reconnect:&#39;,date)\n        capture.release()\n        avg=None\n        if THREAD:\n            capture = ThreadingVideoCapture(cPATH)\n            capture.start()\n        else:\n            capture = cv2.VideoCapture(cPATH)\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()\n    new_name=fname.replace(HEAD,HEAD+&#39;_&#39; + f&#39;{detect_counts:04}&#39;+&#39;_&#39;)\n    os.rename(fname,new_name)\ncv2.destroyAllWindows()<\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u8907\u6570\u53f0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30ab\u30e1\u30e9\u306b\u5bfe\u5fdc\u3057\u3001cuda(GPU)\u3068Thread\u6a5f\u80fd\u3092\u6d3b\u7528\u3067\u304d\u308b\u30d0\u30fc\u30b8\u30e7\u30f3\u3002<\/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-709","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\/709","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=709"}],"version-history":[{"count":1,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/709\/revisions"}],"predecessor-version":[{"id":710,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=\/wp\/v2\/posts\/709\/revisions\/710"}],"wp:attachment":[{"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rfsec.ddns.net\/db\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}