使用 chaquopy 在 android studio 中集成 python 代码(对象检测代码)

Posted

技术标签:

【中文标题】使用 chaquopy 在 android studio 中集成 python 代码(对象检测代码)【英文标题】:Integrating a python code(object detection code) in android studio using chaquopy 【发布时间】:2021-09-10 19:03:03 【问题描述】:

我正在尝试使用chaquopyandroid studio 中集成python 代码(对象检测),但是在手机上进行测试时,我只能得到打印,但没有其他工作??

这是我运行logcat时得到的:

I/zygote64:Dopartialcodecachecollection,code=117KB,data=91KB/zygote64:Aftercodecache
collection,code=117KB,data=91KBIncreasingcodecachecapacityto512KBI/ViewRootImpl:jank_remveInvalidNodeallthenodeinjanklistisoutoftimeV/AudioManager:playSoundEffecteffectType:0I/python.stdout:creation
of
datasetI/python.stdout:W/InputMethodManager:startInputReason=8V/ActivityThread:
Finishing stop of ActivityRecorde39245f
token=android.os.BinderProxy@f8d4de
com.example.radar/com.example.radar.MainActivityV/ActivityThread:
Handle window ActivityRecorde39245f
token=android.os.BinderProxy@f8d4decom.example.radar/com.example.radar.MainActivityvisibility:falseE/BpSurfaceComposerClient:
Failed to transact (-1)E/BpSurfaceComposerClient:Failed to transact
(-1)I/ViewRootImpl: jank_removeInvalidNode all the node in jank list
is out of timeW/InputMethodManager: startInputReason = 1

这就是我运行代码时得到的结果:

2021-06-28 12:48:18.640 27425-27505/com.example.radarE/AwareLog:AtomicFileUtilsreadFileLines file not exist: android.util.AtomicFile@4f41434
2021-06-28 12:48:20.389 27425-27475/com.example.radar E/MemoryLeakMonitorManager: MemoryLeakMonitor.jar is not exist!
2021-06-28 12:48:20.391 27425-27425/com.example.radar E/Minikin: Could not get cmap table size!
2021-06-28 12:52:37.473 27425-27425/com.example.radar E/BpSurfaceComposerClient: Failed to transact (-1)
2021-06-28 12:52:37.474 27425-27425/com.example.radar E/BpSurfaceComposerClient: Failed to transact (-1)

【问题讨论】:

我认为这些日志消息中的任何一条都与您的问题无关。请编辑您的问题以准确解释您正在尝试做什么(如果可能,请使用一些示例代码)以及您期望发生的事情。 我把所有代码都放在了一个答案中,你可以检查一下,提前感谢你的帮助 【参考方案1】:
import cv2
import numpy as np
import vehicles
import requests
#import time
#from matplotlib import pyplot as plt
#import time
#url="http://192.168.43.1:8080/shot.jpg"
def main():
   cnt_up=0
   cnt_down=0
   print("creation of dataset")

   cap=cv2.VideoCapture("C://Users//khaoula//AndroidStudioProjects //RADAR//app//src//main//python//cars.mp4")
   print("1111")
   #Get width and height of video

   w=cap.get(3)
   h=cap.get(4)
   frameArea=h*w
   areaTH=frameArea/400
   print("2222")
   #Lines
   line_up=int(2*(h/5))
   line_down=int(3*(h/5))
   print("33333")
   up_limit=int(1*(h/5))
   down_limit=int(4*(h/5))

   #print("Red line y:",str(line_down))
   #print("Blue line y:",str(line_up))
   line_down_color=(255,0,0)
   line_up_color=(255,0,255)
   pt1 =  [0, line_down]
   pt2 =  [w, line_down]
   print("44444")
   pts_L1 = np.array([pt1,pt2], np.int32)
   pts_L1 = pts_L1.reshape((-1,1,2))
   pt3 =  [0, line_up]
   pt4 =  [w, line_up]
   pts_L2 = np.array([pt3,pt4], np.int32)
   pts_L2 = pts_L2.reshape((-1,1,2))
   print("55555")
   pt5 =  [0, up_limit]
   pt6 =  [w, up_limit]
   pts_L3 = np.array([pt5,pt6], np.int32)
   pts_L3 = pts_L3.reshape((-1,1,2))
   pt7 =  [0, down_limit]
   pt8 =  [w, down_limit]
   pts_L4 = np.array([pt7,pt8], np.int32)
   pts_L4 = pts_L4.reshape((-1,1,2))
   print("666666")
   #Background Subtractor
   fgbg=cv2.createBackgroundSubtractorMOG2(detectShadows=True)
   print("77777")
   #Kernals
   kernalOp = np.ones((3,3),np.uint8)
   kernalOp2 = np.ones((5,5),np.uint8)
   kernalCl = np.ones((11,11),np.uint8)
   print("88888")

   font = cv2.FONT_HERSHEY_SIMPLEX
   cars = []
   max_p_age = 5
   pid = 1
   print("99999")

   while (cap.isOpened()):

    print("kkkkk")
    ret,frame=cap.read()
    rows1,cols1,_=frame.shape
    print(rows1,cols1) # 1280  720
    #roi = frame[50:540, 200:960]
    #cols,rows,_=roi.shape
    #print("cols:")
    #print(cols) #490
    #print("rows:")
    #print(rows) #760

    for i in cars:
     i.age_one()
     print("i:")
     print(i)
    print("10")
    fgmask=fgbg.apply(frame)
    fgmask2=fgbg.apply(frame)
    print("11")
    if ret==True:

     #Binarization
     ret,imBin=cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)
     ret,imBin2=cv2.threshold(fgmask2,200,255,cv2.THRESH_BINARY)
     #OPening i.e First Erode the dilate
     mask=cv2.morphologyEx(imBin,cv2.MORPH_OPEN,kernalOp)
     mask2=cv2.morphologyEx(imBin2,cv2.MORPH_CLOSE,kernalOp)

     #Closing i.e First Dilate then Erode
     mask=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernalCl)
     mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernalCl)
     print("12")


    #Find Contours
    countours0,hierarchy=cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    print("13")
    for cnt in countours0:
        area=cv2.contourArea(cnt)

        if area>areaTH:
            ####Tracking######
            m=cv2.moments(cnt)
            cx=int(m['m10']/m['m00'])
            cy=int(m['m01']/m['m00'])
            x,y,w,h=cv2.boundingRect(cnt)
            #cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 165, 255), 5)
            crop_frame=frame[y-3:y + h+3, x-3:x + w+3]

            new=True
            if cy in range(up_limit,down_limit):
                for i in cars:

                    if abs(x - i.getX()) <= w and abs(y - i.getY()) <= h:
                        new = False
                        i.updateCoords(cx, cy)

                        if i.going_UP(line_down,line_up)==True:
                            cnt_up+=1
                            print("ID:",i.getId(),'crossed going up ')#at', time.strftime("%c"))
                        elif i.going_DOWN(line_down,line_up)==True:
                            cnt_down+=1
                            print("ID:", i.getId(), 'crossed going up')# at', time.strftime("%c"))
                        break
                    if i.getState()=='1':
                        if i.getDir()=='down'and i.getY()>down_limit:
                            i.setDone()
                        elif i.getDir()=='up'and i.getY()<up_limit:
                            i.setDone()
                    if i.timedOut():
                        index=cars.index(i)
                        cars.pop(index)
                        del i
                    #file=*****************************************************************************
                    #file = "C://Users//khaoula//PycharmProjects//Radar//" + "hh.jpg"
                    #cv2.imwrite(file, i)
                if new==True: #If nothing is detected,create new
                    p=vehicles.Car(pid,cx,cy,max_p_age)
                    n=str(pid)
                    cars.append(p)
                    pid+=1

            #cv2.circle(frame,(cx,cy),5,(0,0,255),-1)
            #while True:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
             #print(img)
            #crop_img = roi[y :y + h , x :x + w ]
            # s = cv2.imread(str(crop_img))
             #n = str(pid)  # +"_speed_"+str(sp)
             #file = 'C://Users//khaoula//PycharmProjects//Radar//' + n + '.jpg'
             #cv2.imwrite(file, roi)

            #print("img:")
            #print(img)
            #file = "C://Users//khaoula//PycharmProjects//Radar//" + "hh.jpg"
            #cv2.imwrite(file, img)


    for i in cars:
        cv2.putText(frame, str(i.getId()), (i.getX(), i.getY()), font, 0.3, i.getRGB(), 1, cv2.LINE_AA)
        #crop_img = roi[i.getY():i.getY() + h, i.getX():i.getX() + w]
        file = 'C://Users//khaoula//PycharmProjects//Radar//pics//' + n + '.jpg'
        cv2.imwrite(file, crop_frame)


        #cv2.imshow("img", frameArea)
        #t = time.strftime("%Y-%m-%d_%H-%M-%S")
        #file = "C://Users//khaoula//PycharmProjects//Radar//" + ".jpg"
        #cv2.imwrite(file, frameArea)



    str_up='UP: '+str(cnt_up)
    str_down='DOWN: '+str(cnt_down)
    frame=cv2.polylines(frame,[pts_L1],False,line_down_color,thickness=2)
    frame=cv2.polylines(frame,[pts_L2],False,line_up_color,thickness=2)
    frame=cv2.polylines(frame,[pts_L3],False,(255,255,255),thickness=1)
    frame=cv2.polylines(frame,[pts_L4],False,(255,255,255),thickness=1)
    cv2.putText(frame, str_up, (10, 40), font, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(frame, str_up, (10, 40), font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)
    cv2.putText(frame, str_down, (10, 90), font, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(frame, str_down, (10, 90), font, 0.5, (255, 0, 0), 1, cv2.LINE_AA)
    cv2.imshow('Frame',frame)


    print(str_up)
    print(str_down)
    if cv2.waitKey(1)&0xff==ord('q'):
        break

else:
    break
print("mmmmmmmmmm")
cap.release()
return cap

这是我试图集成到 android studio 中的 python 代码,似乎问题出在 while 循环中,因为我得到所有打印,直到 9999 然后应用程序崩溃我认为这是因为视频我正在努力,但我还不确定

【讨论】:

不幸的是,OpenCV 的 Chaquopy 版本目前不支持读取视频文件(请参阅 here)。我建议您从简单的开始,只需从 JPG 或 PNG 文件加载单个帧。然后,一旦成功,您就可以找到另一种方法从视频中获取多个帧。 此外,Android 设备无法访问您的开发机器上的文件,即使它是在同一台机器上运行的模拟器。相反,您应该使用相对于__file__ 的路径或从外部存储(“sdcard”)加载数据文件。这两个都在the FAQ中进行了解释。 哦,这就是它不起作用的原因,是否可以用手机摄像头的实时录制替换我正在使用的视频文件? Chaquopy OpenCV 构建不支持直接捕获相机图像,但您可以在 Java/Kotlin 中捕获图像,然后将它们发送到 Python 进行处理,如 here 所示。 我明白了,非常感谢您的帮助

以上是关于使用 chaquopy 在 android studio 中集成 python 代码(对象检测代码)的主要内容,如果未能解决你的问题,请参考以下文章

在 android studio 中使用 chaquopy 运行 python 脚本

使用 chaquopy 在 android studio 中集成 python 代码(对象检测代码)

在 android studio 中使用 chaquopy 加载模型 hdf5

如何在使用 Chaquopy 时在 android 中显示加载动画

在 Android Studio 中使用 Chaquopy 将值插入到 python 文件中

chaquopy android apk 大小更大