PermissionError:[Errno 13]使用python写入文本文件并使用UE4读取时

2024-09-28 21:58:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python3.7和unreal engine 4进行一个项目。python代码使用openCV库,通过查找轮廓并标记轮廓的中心点,从摄影机镜头中跟踪对象的位置。然后将中心点坐标转换为字符串并写入文本文件。UE4然后读取文件并打印字符串(目前)。一切都发生在运行时,因为我希望实时跟踪位置

现在这个解决方案起作用了。。。一会儿。当我运行python代码(我使用PyCharm作为IDE)和unreal engine 4时,当字符串在游戏中打印时,它会在短时间内工作(最多10到30秒),但是python脚本会返回一个权限错误

Traceback (most recent call last):
  File "C:/Users/Purs/PycharmProjects/opencv-python/capture1.py", line 53, in <module>
    findColor(img, myColors)
  File "C:/Users/Purs/PycharmProjects/opencv-python/capture1.py", line 26, in findColor
    x,y = getCountours(mask)
  File "C:/Users/Purs/PycharmProjects/opencv-python/capture1.py", line 42, in getCountours
    logistics(s)
  File "C:/Users/Purs/PycharmProjects/opencv-python/capture1.py", line 47, in logistics
    with open(dir, "w") as f:
PermissionError: [Errno 13] Permission denied: 'C:\\\\Users\\\\Purs\\\\Documents\\\\Unreal Projects\\\\TextFileTest\\\\WindowsNoEditor\\\\TextFileTest\\\\Content\\\\Files\\\\data.txt'

这是我用来捕获镜头、找到中心点并写入文本文件的python代码

import cv2
import numpy as np

dir = r"C:\\Users\\Purs\\Documents\\Unreal Projects\\TextFileTest\\WindowsNoEditor\\TextFileTest\\Content\\Files\\data.txt"

frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10, 150)

myColors = [[0,0,255,0,0,255]]
myData = []
s = []

def findColor(img,myColors):
    imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    for color in myColors:
        lower = np.array(color[0:3])
        upper = np.array(color[3:6])
        mask = cv2.inRange(imgHSV,lower,upper)
        x,y = getCountours(mask)
        cv2.circle(imgResult,(x,y),3,(255,0,0),cv2.FILLED)

def getCountours(img):
    contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    x,y,w,h = 0,0,0,0
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area>500:
            cv2.drawContours(imgResult, cnt, -1, (255,0,0), 3)
            peri = cv2.arcLength(cnt, True)
            approx = cv2.approxPolyDP(cnt,0.02*peri,True)
            x, y, w, h = cv2.boundingRect(approx)
            myData = [x, y]
            s = str(myData)[1:-1]
            logistics(s)

    return x+w//2, y+h//2

def logistics(s):
    with open(dir, "w") as f:
        f.write(s)

while True:
    success, img = cap.read()
    imgResult = img.copy()
    findColor(img, myColors)

    cv2.imshow("Result", imgResult)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

我在UE4编辑器和打包游戏中尝试了这一点,但结果似乎是一样的。所有用户都应该有访问文本文件的权限,我已经以管理员身份运行了PyCharm

正如你可能已经注意到的,我是一个初学者,如果这个解决方案是一条死胡同,我不会感到惊讶。因此,如果这不是可挽救的,我会非常感激,如果有人能指出我正确的方向,当谈到从Python(或C++,我认为我应该能够在VS中重建Python代码)传递数据到虚幻。p>

谢谢你,祝你今天愉快


Tags: 代码inpyimglinecv2opencvusers
2条回答

因此,我尝试按照Christoph Rackwitz的建议,通过减少捕获帧的数量来降低写入频率,因为这段代码在每次捕获帧时都会进行写入。这没有起作用,问题依然存在。从一开始,这可能是一种错误的方式,因为同时写入和读取文件时,即使有明显的延迟,也会返回上述错误

然而,我找到了解决问题的办法。我使用套接字,使Python代码充当本地“服务器”,UE4充当客户端。Python可以从一开始就使用套接字,而Unreal需要一个插件。幸运的是,有一个简单的UE4插件可以从市场上获得,这反过来使它易于安装在所有最近的引擎迭代中。就目前而言,结果非常好,足以让我继续原型化我的项目

因此,如果有人想在Python代码和UE4之间实现简单的通信,我可以推荐这种方式。至少对于像我这样的小公司来说

你用的反斜杠太多了。这是一个纯粹的python问题。所有其他图书馆都与这个问题无关

python有“r-strings”,字符串前缀为r,如r"example\with\backslashes and you can't have control characters in here"。在这些例子中,反斜杠是字面意义上的,所以你不能用另一个反斜杠来逃避它

如果使用普通字符串,则必须转义反斜杠。普通字符串中的反斜杠转义控制字符,如换行符。例如:"example\nwith\nnewlines and here's a backslash: \\"

您可以从路径字符串中删除r,也可以从路径反斜杠中删除所有转义反斜杠

相关问题 更多 >