2016-08-01 6 views
0

저는 파이썬과 opencv world에 매우 익숙합니다. 나는 단지 이미지를 읽고 보여 주려고했으나 항상 오류가 발생합니다 :파이썬 모듈 내부의 sys.path 경로에서 이미지를 읽으십시오.

error: D:\Build\OpenCV\opencv-3.1.0\modules\highgui\src\window.cpp:289: error: (-215) size.width>0 && size.height>0 in function cv::imshow

나는 test.py라는 모듈을 만들었습니다. ": \ 이력서 \ 이미지 C" 아래와 같이 보여 :

import cv2; 
import sys; 


sys.path.append('C:\\cv\\images'); 

im = cv2.imread('car.png'); 
cv2.imshow('Car Figure',im); 
cv2.waitKey(0); 

나는를 디버깅 할 때 해당 모듈에서 나는 내 시스템 경로에을 "car.png"이미지 을 읽으려고 코드, 메신저 변수가 초기화되지 않았 음을 알 수 있습니다. 그 이유는 그 오류 코드입니다. 그러나 sys.path를 인터프리터에 입력하면 경로가 이미 모듈을 실행하려고 시도 할 때마다 여러 번 추가되었음을 알 수 있습니다. 그리고 인터프리터에서 직접 모듈 내용을 복사/붙여 넣기하면 코드가 제대로 작동하고 이미지가 나타납니다.

모듈 내부에서 sys.path가 고려되지 않아 python이 이미지를 읽을 수없는 것 같습니다.

이것이 정상적인 동작인지, 아니면 내 모듈 내부에서 sys.path 내용을 해석하도록 통역해야합니까?

답변

1

애플리케이션에서 수행하려는 작업이 확실치 않지만 sys.path이 예제 코드에서 불필요하게 보입니다. 또한, sys.path 그것은 기본적으로

A list of strings that specifies the search path for modules

이라는 Python documentation 말한다, sys.path로드 모듈 자체 모듈의 내부 파일이 아니라입니다.

변수가 이미지를로드하지 않으므로 초기화되지 않습니다. 파일을로드 할 때까지 sys.path bruteforces이 해결 방법은 잘 작동하지만, 우아한 기존, 또는 필요하지 않습니다 : 당신이,를 사용하는 열기 CV의 버전에 대한 source codeinternal load function보고 후

import sys 
import cv2 

sys.path.append('C:\\users\\xxxx\\pictures\\') 

loaded = False 
for rel in sys.path: 
    im = cv2.imread(rel+'image.jpg') 
    if im is not None: 
     loaded = True 
     cv2.imshow('Car Figure',im) 
     cv2.waitKey(0) 

if loaded == False: 
    raise Exception('Couldn\'t load image') 

imread 기능 sys.path을 고려하지 않는 것 같다

Mat imread(const String& filename, int flags) 
{ 
    /// create the basic container 
    Mat img; 

    /// load the data 
    imread_(filename, flags, LOAD_MAT, &img); 

    /// return a reference to the data 
    return img; 
} 
+0

같은 오류를 시도 shoudl 될 것이어야한다. 내가 언급 한대로 모듈 내부에서 sys.path를 출력합니다. 'C : \\ cv \\ images'경로가 이미 sys.path 목록에 있음을 알 수 있습니다. 그러나 imread는 'car.png'파일을 볼 수 없습니다. –

+0

@HishamRagheb 위의 코드를 수정하여 문제를 해결했습니다. 내가 말하는 것은'imread'는'sys.path'를 인식하지 못하기 때문에 소스 코드를 수정하고 Open CV를 다시 컴파일하지 않는 한 그것을 인식하지 못합니다. –

+0

귀중한 정보에 감사드립니다. 당신의 솔루션은 훌륭해 보이지만 opencv 컴파일이 필요합니다. 아직 Java 세계 전설에서 파이썬으로 크롤링하고 있습니다. @holdenweb의 간단한 힌트는 os.path.dirname (sys.argv [0]) + '\\ images'를 사용하면 내 이미지 폴더를 상대적으로 참조 할 수 있습니다. 다시 감사합니다. 투표를 원하지만 내 평판이 여전히 낮습니다. –

1

당신이 sys.path 설정이 파일을 읽을 수있는 디렉토리에 영향을 미칠 것입니다 무엇을 상상하게? 이것은 순수하게 가져 오기 위해 파이썬 모듈을 찾는 데 사용됩니다. 질문에 대답하기 위해, 당신이보고있는 행동은 정상적이고 예상됩니다. 당신이 dir의 디렉토리와 filename에 파일 이름이있는 경우 다음 파일 당신은 개방

os.path.join(dir, filename) 

은 그래서 당신은 여전히 ​​

im = cv2.imread(os.path.join(dir, filename)) 
+0

답변 해 주셔서 감사합니다. 하지만 내 모듈을 휴대 가능하게 만들고 싶다고 말하면됩니다. 전체 경로 이름을 입력하는 대신 현재 모듈 경로를 상대 경로로 참조하는 방법을 알아야합니다. 어떻게해야합니까? –

+1

@HishamRagheb 당신이 google에 가서 "상대 경로 이름"을 검색하면 예제가 * 부 *로 표시됩니다 –

+1

대부분의 모듈에는'__file__' 속성이 있습니다.이 속성에서 ['os.path .dirname (module .__ file__)'] (https://docs.python.org/2/library/os.path.html#os.path.dirname)을 입력 한 다음 읽고 싶은 파일의 이름을 입력하십시오 . – holdenweb