mystarxk 发表于 2023-8-30 17:24:23

Pthon相对路径和绝对路径的问题

各位老师好,求助一个程序中相对路径和绝对路径的问题
下边程序是从网上找来的图片自动裁剪黑边的程序,勉强能看懂,原程序图片的来源和保存文件夹都是用的相对路径,运行都没有问题,我今天企图想把修改位绝对路径,折腾了一下午,毫无结果。
新手刚学了点基础课和简单的库,我能百度到的和我能想到的解决方法都尝试了,路径哪里不知道是哪里错了。
红色部分是我想改为的方式,但是不能正确的运行。
请老师指点下,谢谢。

import cv2
import os
import datetime

def change_size(read_file):
    image = cv2.imread(read_file, 1)# 读取图片 image_name应该是变量
    img = cv2.medianBlur(image, 5)# 中值滤波,去除黑色边际中可能含有的噪声干扰
    b = cv2.threshold(img, 15, 255, cv2.THRESH_BINARY)# 调整裁剪效果
    binary_image = b# 二值图--具有三通道
    binary_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY)
    print(binary_image.shape)# 改为单通道

    x = binary_image.shape
    print("高度x=", x)
    y = binary_image.shape
    print("宽度y=", y)
    edges_x = []
    edges_y = []
    for i in range(x):
      for j in range(y):
            if binary_image == 255:
                edges_x.append(i)
                edges_y.append(j)

    left = min(edges_x)# 左边界
    right = max(edges_x)# 右边界
    width = right - left# 宽度
    bottom = min(edges_y)# 底部
    top = max(edges_y)# 顶部
    height = top - bottom# 高度

    pre1_picture = image# 图片截取
    return pre1_picture# 返回图片数据



source_path = "./training_data/1/"# 图片来源路径
save_path = "./out/"# 图片修改后的保存路径
# source_path = r'C:\Users\mysta\Desktop\截图'# 图片来源路径
# save_path = r'C:\Users\mysta\Desktop\IMG4PDF'# 图片修改后的保存路径
if not os.path.exists(save_path):
    os.mkdir(save_path)
file_names = os.listdir(source_path)
starttime = datetime.datetime.now()
for i in range(len(file_names)):
    x = change_size(source_path + file_names)# 得到文件名
    cv2.imwrite(save_path + file_names, x)
    # x = change_size(os.path.join(source_path,file_names))# 得到文件名
    # cv2.imwrite(os.path.join(save_path,file_names), x)
    print("裁剪:", file_names)
    print("裁剪数量:", i)
    while (i == 2600):
      break
print("裁剪完毕")
endtime = datetime.datetime.now()# 记录结束时间
endtime = (endtime - starttime).seconds
print("裁剪总用时", endtime)

isdkz 发表于 2023-8-30 17:24:48

在这个程序中,相对路径是指相对于当前工作目录的路径,而绝对路径是指完整的文件路径。在这个问题中,您想将程序中的相对路径改为绝对路径。

要将相对路径改为绝对路径,您可以使用 os.path.abspath() 函数。该函数将相对路径转换为绝对路径。在您的代码中,您可以将 source_path 和 save_path 变量的赋值语句修改如下:

source_path = os.path.abspath("./training_data/1/")
save_path = os.path.abspath("./out/")


这样, source_path 和 save_path 变量将包含绝对路径,而不是相对路径。然后,您可以继续使用这些变量进行文件操作。

希望这可以帮助您解决问题!如果您有任何其他问题,请随时提问。

mystarxk 发表于 2023-8-30 18:18:22

isdkz 发表于 2023-8-30 17:24
在这个程序中,相对路径是指相对于当前工作目录的路径,而绝对路径是指完整的文件路径。在这个问题中,您想 ...

老师,抱歉可能我刚入门,还是没有看懂。
红色的赋值赋值语句是我写的,我想把两个绝对路径赋值给source_path和sace_path,然后引用change_size函数来裁剪图片,但是用绝对路径给source_path和sace_path赋值后,   
# x = change_size(os.path.join(source_path,file_names))
# cv2.imwrite(os.path.join(save_path,file_names), x)
这两句不能正确的读取照片和保存照片。
总之就是原先程序相对路径是D:\Python\/training_data/1/,(裁剪的程序是放在D:\Python\里的)保存文件夹是D:\Python\out,
我想用桌面的 “截图”和“IMGPDF”这两个文件夹替代他,不然每次都要把照片剪切到D:\Python\/training_data/1/里边去,有点费劲。

mystarxk 发表于 2023-8-31 09:08:12

可能是路径里有中文了,我自己在调试下吧

smallwh 发表于 2023-9-1 10:17:23

1.source_path = r'C:\Users\mysta\Desktop\截图'# 图片来源路径
save_path = r'C:\Users\mysta\Desktop\IMG4PDF'# 图片修改后的保存路径
检查 截图 是否存在并保证它是一个文件夹

2.for i in range(len(file_names)):
    x = change_size(source_path + file_names)# 得到文件名
    cv2.imwrite(save_path + file_names, x)
    # x = change_size(os.path.join(source_path,file_names))# 得到文件名
    # cv2.imwrite(os.path.join(save_path,file_names), x)
    print("裁剪:", file_names)
file_names是一个列表,不能直接与字符串相加得到文件名。
修改后的代码:
import cv2
import os
import datetime

def change_size(read_file):
    image = cv2.imread(read_file, 1)# 读取图片 image_name应该是变量
    img = cv2.medianBlur(image, 5)# 中值滤波,去除黑色边际中可能含有的噪声干扰
    b = cv2.threshold(img, 15, 255, cv2.THRESH_BINARY)# 调整裁剪效果
    binary_image = b# 二值图--具有三通道
    binary_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY)
    print(binary_image.shape)# 改为单通道

    x = binary_image.shape
    print("高度x=", x)
    y = binary_image.shape
    print("宽度y=", y)
    edges_x = []
    edges_y = []
    for i in range(x):
      for j in range(y):
            if binary_image == 255:
                edges_x.append(i)
                edges_y.append(j)

    left = min(edges_x)# 左边界
    right = max(edges_x)# 右边界
    width = right - left# 宽度
    bottom = min(edges_y)# 底部
    top = max(edges_y)# 顶部
    height = top - bottom# 高度

    pre1_picture = image# 图片截取
    return pre1_picture# 返回图片数据



# source_path = "./training_data/1/"# 图片来源路径
# save_path = "./out/"# 图片修改后的保存路径
source_path = r'C:\Users\mysta\Desktop\截图'# 图片来源路径
save_path = r'C:\Users\mysta\Desktop\IMG4PDF'# 图片修改后的保存路径
if not os.path.exists(save_path):
    os.mkdir(save_path)
file_names = os.listdir(source_path)
starttime = datetime.datetime.now()
for name in file_names:
    # x = change_size(source_path + name)# 得到文件名
    # cv2.imwrite(save_path + name, x)
    x = change_size(os.path.join(source_path,name))# 得到文件名
    cv2.imwrite(os.path.join(save_path,name), x)
    print("裁剪:", name)
    print("裁剪数量:", len(file_names))
print("裁剪完毕")
endtime = datetime.datetime.now()# 记录结束时间
endtime = (endtime - starttime).seconds
print("裁剪总用时", endtime)
页: [1]
查看完整版本: Pthon相对路径和绝对路径的问题