创建图像对元组

时间:2018-01-06 06:29:30

标签: python loops opencv computer-vision

我正在尝试遍历我的子目录,其中每个子目录包含两个图像。我正在尝试阅读这两个图像,并将它们作为一对组合在一个元组中。这就是我所做的:

import os
import os.path
from PIL import Image
import cv2

path = '/Users/abc/Desktop/images'
pairs = []

for root, dirs, files in os.walk(path):
    for file in files:
        if file.startswith('1'):
            im1 = cv2.imread(root + '/' + '1.jpg')
        elif file.startswith('2'):
            im2 = cv2.imread(root + '/' + '2.jpg')

    pair = (im1,im2)
    pairs.append(pair)

但是我收到以下错误:

Traceback (most recent call last):
  File "create_pair.py", line 16, in <module>
    pair = (im1,im2)
NameError: name 'im1' is not defined

我做错了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

原始答案:

在循环之前声明并分配变量。我不认为这是一个很好的方法,但你的问题包含的信息很少,无法提供良好的解决方案。

import os
import os.path
from PIL import Image
import cv2

path = '/Users/abc/Desktop/images'
pairs = []

for root, dirs, files in os.walk(path):

    im1 = None
    im2 = None

    for file in files:
        if file.startswith('1'):
            im1 = cv2.imread(root + '/' + '1.jpg')
        elif file.startswith('2'):
            im2 = cv2.imread(root + '/' + '2.jpg')

    ## TODO: make sure im1 and im2 is `OK`
    # ..

    pair = (im1,im2)
    pairs.append(pair)

更新

1。以此代码snape为例:

def test(x):
    # just for testing
    for i in range(x):
        if i%2 :
            i1 = i # last odd
        else:
            i2 = i # last even
    print(i1, i2)

1)if-condition不满足,然后代码不被执行,变量在被引用时被分配。

>>> test(1)
UnboundLocalError: local variable 'i1' referenced before assignment

2)for-loop以外的loop中的本地分配变量可能仍然存在(如果不被GC删除)。

>>> test(5)
3 4

2. 然后,如果我们想要使用变量,无论条件满足,我们都可以先声明并赋值变量。但请务必check whether the variable is OK

def test2(x):
    # just for testing
    i1,i2 = None, None # declare and assign the variables 
    for i in range(x):
        if i%2 :
            i1 = i # last odd
        else:
            i2 = i # last even

    print(i1, i2)

在使用之前声明并分配变量,不会发生语法错误。

remember to check whether value is ok(我不认为None可以。)

>>> test2(1)
None 0       
>>> test2(5)
3 4

答案 1 :(得分:0)

在您的代码im1中未声明。我的意思是这一行,

im1 = cv2.imread(root + '/' + '1.jpg')

确保您已经完成所有条件。否则在for循环之前声明im1im2的默认值。

答案 2 :(得分:0)

&#39; IF&#39; im1的条件不满足。这可能是由于两个原因1.文件(1.jpg)不存在。 2.文件名将有所不同,如&#39; 1.JPG&#39;或&#39; ~1.jpg&#39;等完全检查它。添加声明&#39;打印文件&#39;检查位置

中的文件
import os
import os.path
from PIL import Image
import cv2

path = '/Users/abc/Desktop/images'
pairs = []

for root, dirs, files in os.walk(path):
    for file in files:
        if file.startswith('1'): 
            im1 = cv2.imread(root + '/' + '1.jpg')
        elif file.startswith('2'):
            im2 = cv2.imread(root + '/' + '2.jpg')

    pair = (im1,im2)
    pairs.append(pair)