OpenCV Python은 컴퓨터 비전 문제를 해결하도록 설계된 Python 링크 라이브러리입니다. cv2.putText
() 메소드는 모든 이미지에 텍스트 문자열을 그리는 데 사용됩니다.
cv2 puttext
무효 cv::putText | ( | InputOutputArray | img, |
const 문자열 & | 텍스트, | ||
포인트 | 조직 , | ||
int | fontFace, | ||
이중 | fontScale, | ||
< /td> | 스칼라 | 색상, | |
int | 두께 = 1 , | ||
int | < td class="paramname">lineType =|||
bool | bottomLeftOrigin = 거짓 | ||
) |
구문: cv2.putText(image, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) 매개변수: image : 텍스트가 그려질 이미지입니다.
text: 그릴 텍스트 문자열입니다.
org: 이미지에서 문자열의 왼쪽 하단 모서리의 좌표입니다. 좌표는 (X 좌표 값, Y 좌표 값) 두 값의 튜플로 표시됩니다.
글꼴: 글꼴 유형을 나타냅니다. 일부 글꼴 유형은 FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN 등입니다.
fontScale: 글꼴별 기본 크기를 곱한 글꼴 배율입니다.
color: 그릴 문자열의 색상입니다. BGR의 경우 튜플을 전달합니다. 예: 파란색의 경우 (255, 0, 0).
thickness: 선의 두께(px)입니다.
lineType: 선택적 매개변수입니다. 사용할 라인의 유형을 제공합니다.
bottomLeftOrigin: 선택적 매개변수입니다. true인 경우 이미지 데이터 원점은 왼쪽 하단 모서리에 있습니다. 그렇지 않으면 왼쪽 상단 모서리에 있습니다.
반환 값: 이미지를 반환합니다.
Python OpenCV2를 사용하여 Windows에서 이미지에 텍스트를 쓰는 방법은 무엇입니까?
StackOverflow 질문
텍스트를 입력하고 싶습니다. 이미지. 다음과 같이 코드를 작성하고 있습니다.
cv2.putText(image,"Hello World!!!", (x,y), cv2.CV_FONT_HERSHEY_SIMPLEX, 2, 255)
`module` 개체에 `CV_FONT_HERSHEY_SIMPLEX` 속성이 없다는 오류가 발생합니다.
Query Can`䭓 위와 같은 폰트를 사용하고 있습니까? 인터넷 검색을 해보니 initFont용 Opencv C++ 관련 문법만 찾았습니다. 그런 다음 putText
를 사용하여 글꼴 유형을 매개변수로 전달하는 방법을 생각했습니다. 하지만 작동하지 않습니다.
제안 사항이 있습니까?
답변:
이 코드는 cv2.putText를 사용하여 이미지에 텍스트를 오버레이합니다. NumPy 및 OpenCV가 설치되어 있어야 합니다.
가져오기 numpy as np 가져오기 cv2 # 검은색 이미지 만들기 img = np.zeros((512,512,3), np.uint8) # 텍스트 작성 font = cv2.FONT_HERSHEY_SIMPLEX bottomLeftCornerOfText = ( 10,500) fontScale = 1 fontColor = (255,255,255) lineType = 2 cv2.putText(img,`Hello World!`, bottomLeftCornerOfText, font, fontScale, fontColor, lineType) #디스플레이 이미지 cv2.imshow("img",img) #이미지 저장 cv2.imwrite ("out.jpg", img) cv2.waitKey(0)
Python cv2.puttext를 사용하여 이미지 중앙에 텍스트 쓰기
이미지에 쓰는 텍스트의 모양(너비, 높이)을 알면 중앙에 넣을 수 있습니다 이미지에 맞춰 정렬됩니다.
위의 예에서 텍스트의 대략적인 모양은 (268, 36)입니다. 그림판이나 다른 응용 프로그램을 사용하여 특정 텍스트의 모양을 찾아야 할 수도 있습니다.
import numpy as np import cv2 image = cv2.imread(`sample.png`,cv2.IMREAD_UNCHANGED) position = ( (int) (image.shape[1]/2 - 268/2), (int) (image.shape[0]/2 - 36/2)) cv2.putText( image, #numpy 텍스트가 쓰여지는 배열 "파이썬 예제", #텍스트 위치, #쓰기를 시작해야 하는 위치 cv2.FONT_HERSHEY_SIMPLEX, #글꼴 패밀리 1, #글꼴 크기(209, 80, 0, 255), #글꼴 색상 3) #글꼴 스트로크 cv2.imwrite (`output.png`, 이미지)
출력 이미지:
Python OpenCV puttext
cv2 퍼테 xt 예제 #
def detect(imgfile): origimg = cv2.imread(imgfile) img = preprocess(origimg) img = img.astype(np.float32) img = img.transpose((2, 0) , 1)) net.blobs[`data`].data[...] = img out = net.forward() box, conf, cls = postprocess(origimg, out) for i in range(len(box)) : p1 = (box[i][0], box[i][1]) p2 = (box[i][2], box[i][3]) cv2.rectangle(origimg, p1, p2, ( 0,255,0)) p3 = (최대(p1[0], 15), 최대(p1[1], 15)) 제목 = "%s:%.2f" % (COCO_CLASSES[int(cls[i])] , conf[i]) cv2.putText(origimg, 제목, p3, cv2.FONT_ITALIC, 0.6, (0, 255, 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #Exit if k == 27: return False return True
cv2.puttext 예제 #
def drawBoundingBox(self,imgcv,result): 결과 상자 : # print(box) x1,y1,x2,y2 = (box[`topleft`][`x`],box[`topleft`][`y`],box[`bottomright`][`x`] ,box[`bottomright`][`y`]) conf = box[`Confidence`] # print(conf) label = box[`label`] if conf < self.predictThresh: continue # print(x1,y1,x2 ,y2,conf, 레이블) cv2.rectangle(imgcv,(x1,y1),(x2,y2),(0,255,0),6) labelSize=cv2.getTextSize(label,cv2.FONT_HERSHEY_COMPLEX,0.5,2) # print(`labelSize> >`,labelSize) _x1 = x1 _y1 = y1#+int(labelSize[0][1]/2) _x2 = _x1+labelSize[0][0] _y2 = y1-int(labelSize[0][1]) cv2.rectangle(imgcv,(_x1,_y1),(_x2,_y2),(0,255,0),cv2.FILLED) cv2.putText(imgcv,label,(x1,y1),cv2.FONT_HERSHEY_COMPLEX,0.5,(0) ,0,0),1) imgcv 반환
cv2 puttext 예제 #
def draw_labels(x, y, class_names=None): img = x.numpy() if img. ndim == 2 또는 img.shape[2] == 1: img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 상자, 클래스 = tf.split(y, (4, 1), axis=-1) 클래스 = classes[..., 0] wh = np.flip(img.shape[0:2]) min_wh = np.amin(wh) if min_wh <= 100: font_size = 0.5 else: font_size = 1 for i in range( len(박스)): x1y1 = 튜플((np.array(boxes[i][0:2]) * wh).astype(np.int32)) x2y2 = 튜플((np.array(boxes[i][ 2:4]) * wh).astype(np.int32)) img = cv2.rectangle(img, x1y1, x2y2, (255, 0, 0), 1) if class_names: img = cv2.putText(img, class_names[classes[i]], x1y1, cv2.FONT_HERSHEY_COMPLEX_SMALL, font_size, (0, 0, 255), 1) else: img = cv2.putText(img, str(classes[i]), x1y1, cv2.FONT_HERSHEY_COMPLEX 1, (0, 0, 255), 1) return img
cv2.puttext 예제 #
def draw_outputs(img, output, class_names=None): boxs, objectness, classes = 출력 #boxes, objectness, classes = boxs[0], objectness[0], classes[0] wh = np.flip(img.shape[0:2]) if img.ndim == 2 or img.shape[ 2] == 1: img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) min_wh = np.amin(wh) if min_wh <= 100: font_size = 0.5 else: font_size = 1 for i in range(classes.shape[0 ]): x1y1 = 튜플((np.array(boxes[i][0:2]) * wh).astype(np.int32)) x2y2 = 튜플((np.array(boxes[i][2:4) ]) * wh).astype(np.int32)) img = cv2.rectangle(img, x1y1, x2y2, (255, 0, 0), 1) img = cv2.putText(img, `{}`.format( int(classes[i])), x1y1, cv2.FONT_HERSHEY_COMPLEX_SMALL, font_size, (0, 0, 255), 1) return img
cv2 puttext 예제 #
def detect( imgfile): 원본 = cv2.imread(imgfile) img = 전처리(origimg) img = img.astype(np.float32) img = img.transpose((2, 0, 1)) net.blobs[`data`].data[.. .] = img out = net.forward() box, conf, cls = postprocess(origimg, out) in range(len(box)): p1 = (box[i][0], box[i][ 1]) p2 = (box[i][2], box[i][3]) cv2.rectangle(origimg, p1, p2, (0,255,0)) p3 = (최대(p1[0], 15) , 최대(p1[1], 15)) 제목 = "%s:%.2f" % (CLASSES[int(cls[i])], conf[i]) cv2.putText(origimg, 제목, p3, cv2 .FONT_ITALIC, 0.6, (0, 255, 0), 1) cv2.imshow("SSD", origimg) k = cv2.waitKey(0) & 0xff #k == 27인 경우 ESC를 누르면 종료: False 반환 True 반환
cv2.puttext 예제 #
def draw_boxes_frame(frame, frame_size, box_dicts, class_names, input_size): """비디오 프레임에서 감지된 상자를 그립니다.""" box_dict = box_dicts[ 0] resize_factor = (frame_size[0] / input_size[1], frame_size[1] / input_size[0]) for cls in range(len(class_names)): boxs = boxs_dict[cls] color = (0, 0, 255 ) if np.size(boxes) != 0: 상자 안의 경우: xy = box[:4] xy = [int(xy[i] * resize_factor[i % 2]) for i in range(4)] cv2.rectangle(frame, (xy[0], xy[1]), (xy [2], xy[3]), 색상[::-1], 2) (test_width, text_height), 기준선 = cv2.getTextSize(class_names[cls], cv2.FONT_HERSHEY_SIMPLEX, 0.75, 1) cv2.rectangle(프레임 , (xy[0], xy[1]), (xy[0] + test_width, xy[1] - text_height - 기준선), color[::-1], 두께=cv2.FILLED) cv2.putText(프레임 , class_names[cls], (xy[0], xy[1] - 기준선), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 0), 1)
cv2 puttext 예제 #
def ProcessFrame(self, frame): # segment arm region segment = self.SegmentArm(frame) # 그릴 때 그릴 분할된 이미지의 복사본 만들기 = cv2.cvtColor(segment, cv2.COLOR_GRAY2RGB) # 일부 그리기 손을 올바르게 배치하기 위한 도우미 cv2.circle(draw,(self.imgWidth/2,self.imgHeight/2),3,[255,102,0],2) cv2.rectangle(draw, (self.imgWidth/3,self. imgHeight/3), (self.imgWidth*2/3, self.imgHeight*2/3), [255,102,0],2) # 분할된 영역의 헐을 찾고, 이를 기반으로 # c onvexity 결함 [contours,defects] = self.FindHullDefects(segment) # 윤곽과 볼록 결함에 따라 손가락의 수를 감지 # 손가락에 속하는 결함을 그린 녹색, 기타 빨간색 [nofingers,draw] = self.DetectNumberFingers(contours, 결함, 그리기) # 이미지에 손가락 수 인쇄 cv2.putText(draw, str(nofingers), (30,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255)) return draw
cv2.puttext 예제 #
def vis_class(img, pos, class_str, bg_color): """클래스를 시각화합니다."" font_color = cfg.VIS.SHOW_CLASS.COLOR font_scale = cfg.VIS.SHOW_CLASS.FONT_SCALE x0 , y0 = int(pos[0]), int(pos[1]) # 텍스트 크기를 계산합니다. txt = class_str font = cv2.FONT_HERSHEY_SIMPLEX ((txt_w, txt_h), _) = cv2.getTextSize(txt, font, font_scale, 1) # 텍스트 배경을 배치합니다. back_tl = x0, y0 - int(1.3 * txt_h) back_br = x0 + txt_w, y0 cv2.rectangle(img, back_tl, back_br, bg_color, -1) # 텍스트를 표시합니다. txt_tl = x0, y0 - int(0.3 * txt_h) cv2.putText(img, txt, txt_tl, font, font_scale, font_color, lineType=cv2.LINE_AA) return img
cv2 puttext 예제 #
def plot_one_box(x, img, color=None, label=None, line_thickness=None): # 이미지에 경계 상자 하나를 플로팅합니다. img tl = line_thickness or round(0.002 * (img.shape[0] + img. shape[1]) / 2) + 1 # 선 두께 color = color 또는 [random.randint(0, 255) for _ in range(3)] c1, c2 = (int(x[0]), int(x) [1])), (int(x[2]), int(x[3])) cv2.rectangle(img, c1, c2, color, thickness=tl) if label: tf = max(tl - 1, 1) # 글꼴 두께 t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0] c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3 cv2.rectangle(img, c1, c2, color, -1) # 채워진 cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255 , 255], 두께=tf, lineType=cv2.LINE_AA)
cv2.puttext 예제 #
def vis_det_and_mask(im, class_name, dets, mask, thresh=0.8): " ""탐지물을 시각적으로 디버깅합니다.""" n um_dets = np.minimum(10, dets.shape[0]) colors_mask = random_colors(num_dets) colors_bbox = np.round(np.random.rand(num_dets, 3) * 255) # 좌표에 따라 rois를 정렬하고 위쪽을 그립니다. bbox 먼저 draw_mask = np.zeros(im.shape[:2], dtype=np.uint8) for i in range(1): bbox = tuple(int(np.round(x)) for x in dets[i, :4]) mask = mask[i,:,:] full_mask = unmold_mask(mask, bbox, im.shape) score = dets[i, -1] if score > thresh: word_width = len(class_name) cv2.rectangle( im, bbox[0:2], bbox[2:4], colors_bbox[i], 2) cv2.rectangle(im, bbox[0:2], (bbox[0] + 18 + word_width*8, bbox[ 1]+15), colors_bbox[i], 두께=cv2.FILLED) apply_mask(im, full_mask, draw_mask, colors_mask[i], 0.5) draw_mask += full_mask cv2.putText(im, `%s` % (class_name) , (bbox[0]+5, bbox[1] + 12), cv2.FONT_HERSHEY_PLAIN, 1.0, (255,255,255), 두께=1) im반환