英文:
writing text to an image in opencv
问题
I'm trying to write text I've converted from an image to an ascii art into a different image, but for some reason I keep getting strange shapes and not the letters (in English) that were converted.
Here is the result of my function so far:
I suspect it has something to do with the font.
Here is the relevant code:
def saveTxtAsPicute(file_path, width, height, currentframe):
"""
converts txt file to picture then saves it
:param file: txt file to convert
:return: the filtered ascii image
"""
# Open text file and read content
with open(file_path, 'r') as file:
text = file.read()
# Define image size and font size
font_size = 14
# Create a new image
img = np.zeros((int(height), int(width), 3), dtype=np.uint8)
img.fill(255)
# Set font and get text size
font = cv2.FONT_HERSHEY_SIMPLEX
text_width, text_height = cv2.getTextSize(text, font, font_size, 2)[0]
# Calculate the number of columns and rows
cols = int(width / font_size)
rows = int(text_height / font_size)
# Draw text on the image
x = y = 0
for i in range(len(text)):
cv2.putText(img, text[i], (x, y+font_size), font, font_size/2, (0, 0, 0), 1, cv2.LINE_AA)
x += font_size
if x >= width:
x = 0
y += font_size
# Save the image
cv2.imwrite('./txtFilesPic/text_image' + str(currentframe) + '.jpg', img)
英文:
I'm trying to write text I've converted from an image to an ascii art into a different image, but for some reason I keep getting strange shapes and not the letters (in english) the were converted.
Here is the result of my function so far:
I suspect it has something to do with the font.
Here is the relevant code:
def saveTxtAsPicute(file_path, width, height, currentframe):
"""
converts txt file to picture then saves it
:param file: txt file to convert
:return: the filtered ascii image
"""
# Open text file and read content
with open(file_path, 'r') as file:
text = file.read()
# Define image size and font size
font_size = 14
# Create new image
img = np.zeros((int(height), int(width), 3), dtype=np.uint8)
img.fill(255)
# Set font and get text size
font = cv2.FONT_HERSHEY_SIMPLEX
text_width, text_height = cv2.getTextSize(text, font, font_size, 2)[0]
# Calculate number of columns and rows
cols = int(width / font_size)
rows = int(text_height / font_size)
# Draw text on image
x = y = 0
for i in range(len(text)):
cv2.putText(img, text[i], (x, y+font_size), font, font_size/2, (0, 0, 0), 1, cv2.LINE_AA)
x += font_size
if x >= width:
x = 0
y += font_size
# Save image
cv2.imwrite('./txtFilesPic/text_image' + str(currentframe) + '.jpg', img)
答案1
得分: 1
以下是翻译好的部分:
1- cv2.FONT_HERSHEY_SIMPLEX使用的默认字体不是等宽的。这意味着每个字符的宽度不相等,一些字符如'i'可能占据较少的空间,而其他字符如'k'可能占据更多的空间。因此,如果您在每次迭代时以相同的值增加起始x位置,它将看起来像这样:
要避免这种间距,您可以使用等宽字体,比如roberto mono等。
2- 字体大小不会精确地转化为像素值。例如,字体大小为12的字体不一定在图像中是12像素。因此,如果您只是增加在每次迭代中增加x和y的比例,您的图像应该看起来更清晰。
希望这些翻译能对您有所帮助。
英文:
you are in the right direction however there are few things you should keep in mind
1- The default font used by cv2.FONT_HERSHEY_SIMPLEX is not monospaced. Which means, every character does not take equal width, some characters like 'i' can take less space whereas others like 'k' can take more. Thus if you increase your starting x position by the same value at each iteration, it would look something like this
To avoid this type of spacing, you can use monospace fonts like roberto mono etc
2- The font size does not translate exactly into pixel values. For example, a font size of 12 will not necessarily be 12 pixels in the image. Thus if u just increase the scale with which u are increasing the x and y in each iteration, your image should look a lot cleaner
def saveTxtAsPicute(file_path, width, height ):
"""
converts txt file to picture then saves it
:param file: txt file to convert
:return: the filtered ascii image
"""
# Open text file and read content
with open(file_path, 'r') as file:
text = file.read()
# Define image size and font size
font_size = 2
# Create new image
img = np.zeros((int(height), int(width), 3), dtype=np.uint8)
img.fill(255)
# Set font and get text size
font = cv2.FONT_HERSHEY_SIMPLEX
text_width, text_height = cv2.getTextSize(text, font, font_size, 2)[0]
# Calculate number of columns and rows
#cols = int(width / font_size)
#rows = int(text_height / font_size)
text =text.strip()
print (text)
# Draw text on image
x = y = 0
y = 80
for i in range(len(text)):
cv2.putText(img, text[i], (x,y+6*font_size), font, font_size, (0, 0, 0))
x += font_size*19
if x >= width:
x = 0
y += 25*font_size
# Save image
cv2.imwrite('./text_image' + '.jpg', img)
saveTxtAsPicute('./foo.txt',100,500)
This code with "hit it up" as the text in the file would give you the following output
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论