2014-07-10 4 views
2

선 두께를 1보다 크게 지정하면 cv2.line()에 의해 그려지는 결과 선의 폭이 지정된 것보다 넓습니다. 1,2,3,4,5,6의 두께를 지정하면 선 너비가 각각 1,3,5,5,7,7이됩니다. 나는 다른 lineType 값 (4,8,16)과 서브 픽셀 포인트 위치를 사용하여 라인 너비에 영향을 미치지 않고 shift 매개 변수를 시도했다. 내가 뭔가 잘못하고 있는거야? 예를 들어Python OpenCV 그리기 선 너비

:

[[0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0] 
[1 1 1 1 1 1 1 1 1 1] 
[1 1 1 1 1 1 1 1 1 1] 
[1 1 1 1 1 1 1 1 1 1] 
[0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0]] 

답변

2

귀하의 질문은 간단 하나이며, 대답은 물론 간단한 하나입니다 :

import numpy as np 
import cv2 

a = np.zeros((10,10), dtype=np.uint8) 
cv2.line(a, (0,4), (9,4), 1, 2) 
print(a) 

는 생산 아니, 당신은 일을하지 않는 아무 잘못. OpenCV에서의 선 그리기 구현은 아주 기본적인 것으로 보인다.

필자는 몇 줄의 선 너비와 분수의 시작 및 끝 위치를 사용하여이 작업을 시도했습니다. 선 너비 매개 변수가 실제로 작동하지 않습니다. 간단한 Brezenham 라인 (정수 픽셀 위치의 단일 픽셀 라인)은 좋지만 두꺼운 라인은 좋지 않습니다.

import numpy as np 
import cv2 

a = np.zeros((200,200),dtype=np.uint8) 
for u in np.exp(np.linspace(0,1j*2*np.pi,25)): 
    cv2.line(a, (100, 100), (int(100+100*u.real+.5), int(100+100*u.imag+.5)), 255, 2) 
cv2.imwrite('lines.png', a) 

는 당신이 얻을 것은 이것이다 :

이 테스트 코드를 참조

enter image description here

선 두께는 각도에 크게 의존; 대각선은 수평선 또는 수직선보다 훨씬 두껍습니다. 또한, 선의 두께는 당신이 알아 차렸 듯이 어쨌든 틀립니다 (가장 얇은 곳에서 3). 앤티 앨리어스를 사용하더라도 큰 변화는 없습니다. 이이 부분 좌표를 할 경우

그러나, 두께 편차가 작다 (그러나 두께는 여전히 잘못된 것입니다) :

import numpy as np 
import cv2 

a = np.zeros((200,200),dtype=np.uint8) 
for u in np.exp(np.linspace(0,1j*2*np.pi,25)): 
    cv2.line(a, (1600, 1600), (int(1600+1600*u.real+.5), int(1600+1600*u.imag+.5)), 255, 2, shift=4) 
cv2.imwrite('lines_shift.png', a) 
또한

enter image description here

, 문제는 굵은 선으로 사라질 것으로 보인다 (두께 5로 설정, 실제 두께 7, 분수 좌표 없음). 이 회전에 의존하는 오류가 첨가제 제안 :

enter image description here

은 그럼 폭 10, 11의 파일을 겹쳐 그려 봅시다, 그리고 회색의 다른 색조와 12 :

import numpy as np 
import cv2 

a = np.zeros((200,200),dtype=np.uint8) 
for u in np.exp(np.linspace(0,1j*2*np.pi,25)): 
    cv2.line(a, (100, 100), (int(100+100*u.real+.5), int(100+100*u.imag+.5)), 255, 12) 
    cv2.line(a, (100, 100), (int(100+100*u.real+.5), int(100+100*u.imag+.5)), 128, 11) 
    cv2.line(a, (100, 100), (int(100+100*u.real+.5), int(100+100*u.imag+.5)), 64, 10) 
cv2.imwrite('lines_variation.png', a) 

enter image description here

원칙적으로 세 가지 색상이 표시되어야하지만 실제로는 두 가지 색상 만 표시됩니다. 즉 너비가 11과 12 인 선은 동일한 폭 (13)으로 그려집니다. 분수 좌표가있는 모든 트릭은 동일한 결과를 생성합니다.

요약 : 홀수 선 너비 만 사용할 수 있습니다. 좁은 선은 분수 (시프트 된) 좌표가 사용되지 않으면 큰 상대 너비 오류가 있습니다. 더 많은 제어가 필요할 경우 더 높은 해상도에서 더 두꺼운 선을 그린 다음 다운 샘플링하십시오. (서투른, 알아.)

위의 테스트는 OpenCV 버전 2.4.9에서 수행되었습니다.

+0

그것이 내가 의심하는 바입니다. 그런 철저한 대답에 감사드립니다. 불행히도 선폭을 정밀하게 제어해야합니다. 추천하는 다른 드로잉 라이브러리가 있습니까? OpenCV의 매력은 단순함이었습니다. 나는 Pycairo를 보았다. 그러나 그것은 나의 필요를 위해 조금 무거워 보였다. –

+0

그러면'PIL'이나'Pillow'가 당신의 필요에 맞을지 시험해 볼 수 있습니다. 그러면 약간의 작업으로 당신이 원하는 것을'aggdraw' 할 수있을 것입니다. 이 작업은 실제로 이런 종류의 작업을 위해 만들어졌지만 불행히도 설치하기 쉬운 형태로 매우 적극적으로 관리되지는 않습니다. 참조 : https://bitbucket.org/2degrees/aggdraw-64bits/src – DrV