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



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

现在这个解决方案有效了。。。等一下。当我运行python代码(我使用PyCharm作为IDE(和虚幻引擎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代码(传递到Unreal时。

谢谢你,祝你今天愉快!

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

python具有";r串";,前缀为r的字符串,如r"examplewithbackslashes and you can't have control characters in here"。在这些情况下,反斜杠是从字面上取的,所以你不会用另一个反斜杠来转义它。

如果使用普通字符串,则必须对反斜杠进行转义。普通字符串中的反斜杠转义换行符等控制字符。例如:CCD_ 3。

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

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

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

因此,如果有人想要Python代码和UE4之间的轻松通信,我可以推荐它。至少对于像我这样的小型企业来说是这样。

最新更新