标签: opencv-python

如何在 cv2.pyrDown() 或 pyrUp() 方法中指定自定义输出大小

我想在图像上应用cv2.pyrDown()时明确指定图像的输出大小。

def gaussian_pyramid(image, scale=1.5, minSize=(30, 30)):
    yield image
    while True:
        w = int(image.shape[1] / scale)
        h = int(image.shape[0] / scale)
        image = cv2.pyrDown(image, dstsize=(w, h))
        if image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:
            break
        yield image
Run Code Online (Sandbox Code Playgroud)

但它抛出了一个类似于此的错误。

OpenCV Error: Assertion failed (ssize.width > 0 && ssize.height > 0 && std::abs(dsize.width*2 - ssize.width) <= 2 && std::abs(dsize.height*2 - ssize.height) <= 2) in pyrDown_, file /io/opencv/modules/imgproc/src/pyramids.cpp, line 873
Run Code Online (Sandbox Code Playgroud)

任何想法如何将图像的输出大小指定为方法参数。

python opencv opencv-python

5
推荐指数
1
解决办法
4764
查看次数

使用 PIL 在 OpenCV Python 中更改字体系列

上面的答案并没有解决我的问题。

我正在使用cv2.putText()将文本放在视频上。

这按预期工作,但我正在尝试使用不同的字体(在 OpenCV 中不可用)。

我知道 OpenCV 仅限于cv2.FONT_HERSHEY字体,所以我使用 PIL 和 OpenCV 来实现这一点。

我将这种方法用于图像,并且该实验成功了。但是当我在视频上尝试类似的东西时我失败了。

import cv2
from PIL import ImageFont, ImageDraw, Image

camera = cv2.VideoCapture('some_video.wmv')
while cv2.waitKey(30) < 0:
    rv, frame = camera.read()
    if rv:
        font = ImageFont.truetype("calibrii.ttf", 80)
        cv2.putText(frame, 'Hello World!', (600, 600), font, 2.8, 255)
        cv2.imshow('Video', frame)
Run Code Online (Sandbox Code Playgroud)

我在同一目录中有“calibrii.ttf”,正如我所提到的,这种方法适用于图像。

这是错误:

cv2.putText(frame, 'Hello World!', (600, 600), font, 2.8, 255)
TypeError: an integer is required (got type FreeTypeFont)
Run Code Online (Sandbox Code Playgroud)

python opencv pillow opencv-python

5
推荐指数
1
解决办法
4571
查看次数

查找图像是亮还是暗

我想知道如何使用 OpenCV 在 Python 3 中编写一个函数,它接收图像和阈值,并在严重模糊并降低质量(越快越好)后返回“暗”或“亮”。这听起来可能含糊不清,但任何有效的方法都行。

python opencv image-processing opencv-python

5
推荐指数
3
解决办法
9597
查看次数

从扫描文档 opencv python 中提取内衬表

我想从扫描的表格中提取信息并将其存储为 csv。现在我的表提取算法执行以下步骤。

  1. 应用歪斜校正
  2. 应用高斯滤波器进行去噪。
  3. 使用 Otsu 阈值进行二值化
  4. 做形态学开运算。
  5. 精明的egde检测
  6. 进行霍夫变换以获得表格行。
  7. 删除重复行(10 像素范围内的相同行)
  8. 使用线的斜率过滤水平线和垂直线(水平线和垂直线的斜率应小于 +/-5 度)。

该算法适用于数字原生 pdf 和大多数扫描文档。但是,某些文档有一个嘈杂的表格,因此无法正确识别行。

这是我的算法失败的示例图像。

原始图像

这些是我在这张桌子上做的操作。1.高斯模糊

高斯模糊

2.Otsu阈值

大津阈值

3.形态开口

形态开口

4.Canny边缘检测

Canny 边缘检测

5.filtered lines,如您所见,这些线条显然没有正确识别。

过滤后的行,如您所见,这些行显然没有正确识别。

任何人都可以提出更好的方法来从这种质量较差的扫描中提取水平线和垂直线。

提前致谢!!

python opencv image-processing hough-transform opencv-python

5
推荐指数
1
解决办法
3429
查看次数

使用 OpenCV Python 创建一个新的相机源(使用 Python 的相机驱动程序)

有谁知道使用 python 创建相机源的方法?例如,我有 2 个摄像头:

  1. 摄像头
  2. USB 摄像头

每当我使用任何需要摄像头的 Web 应用程序或界面时,我都可以从上述两个选项中选择一个摄像头源。

我想要实现的是,我正在使用我自己的相机门户在我的 python 程序中处理实时帧,如下所示:

import numpy as np
import cv2

    while True:
        _,frame = self.cam.read()
        k = cv2.waitKey(1)
        if k & 0xFF == ord('q'):
            self.cam.release()
            cv2.destroyAllWindows()
            break
        else:
            cv2.imshow("Frame",frame)
Run Code Online (Sandbox Code Playgroud)

现在我想将其frame用作相机源,因此下次每当我打开需要相机的软件或网络应用程序时,它都会显示如下选项:

  1. 摄像头
  2. USB 摄像头
  3. Python Cam(或任何名称)

有没有人对如何去做有任何建议或提示?我见过一些高级软件,它们生成自己的相机源,但它们是用 C++ 编写的。我想知道这是否会发生在 python 中。

这是一个相同的例子:

在此处输入图片说明

如您所见,那里有多个摄像机源。我想添加一个相机源,它在其提要中显示由 python 处理的帧。

python opencv-python

5
推荐指数
1
解决办法
1677
查看次数

OpenCV的`getTextSize`和`putText`返回错误的大小,并用较低的像素分割字母

我有以下Python代码:

FONT = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 1.0
FONT_THICKNESS = 2
bg_color = (255, 255, 255)
label_color = (0, 0, 0)

label = 'Propaganda'
label_width, label_height = cv2.getTextSize(label, FONT, FONT_SCALE, FONT_THICKNESS)[0]
label_patch = np.zeros((label_height, label_width, 3), np.uint8)
label_patch[:,:] = bg_color
Run Code Online (Sandbox Code Playgroud)

我创建了一个新的空白图片,其大小由返回getTextSize,然后根据docs在左下角添加文本,该文本x = 0, y = (height - 1)使用相同的字体,比例和粗细参数getTextSize

cv2.putText(label_patch, label, (0, label_height - 1), FONT, FONT_SCALE, label_color, FONT_THICKNESS)
Run Code Online (Sandbox Code Playgroud)

但是当我在图像上使用imshowimwritelabel_patch,这是我得到的结果:

在此处输入图片说明

它可以很容易地看出,小写 p字母和小写g是切在中间,这样ga不能甚至加以区分。如何使OpenCV getTextSize返回正确的大小,如何使OpenCV …

opencv opencv-python opencv-text

4
推荐指数
1
解决办法
2765
查看次数

查找图像 rgb 像素颜色计数的最快方法

我有一个用例,我必须在搜索后找到实时视频每一帧的连续 rgb 像素颜色计数,我发现了一段代码,它做同样的事情,但性能方面需要大约 3 秒才能给我输出,但在在我的情况下,我必须尽快进行此计算,可能是 1 秒内 25 帧。有人可以通过重构以下代码来帮助我弄清楚如何做到这一点

from PIL import Image
import timeit

starttime = timeit.default_timer()
with Image.open("netflix.png") as image:
    color_count = {}
    width, height = image.size
    print(width,height)
    rgb_image = image.convert('RGB')
    for x in range(width):
        for y in range(height):
            rgb = rgb_image.getpixel((x, y))
            if rgb in color_count:
                color_count[rgb] += 1
            else:
                color_count[rgb] = 1

    print('Pixel Count per Unique Color:')
    print('-' * 30)
    print(len(color_count.items()))
print("The time difference is :", timeit.default_timer() - starttime)
Run Code Online (Sandbox Code Playgroud)

输出:

每个唯一颜色的像素数:130869

时差为:3.9660612

python-imaging-library opencv-python

4
推荐指数
1
解决办法
3787
查看次数

使用opencv python从表单中检测复选框

给定一个牙科表格作为输入,需要使用图像处理找到表格中存在的所有复选框。我在下面回答了我目前的方法。有没有更好的方法来查找低质量文档的复选框?

样本输入:

屏蔽输入图像

python opencv information-retrieval image-processing opencv-python

3
推荐指数
1
解决办法
1465
查看次数

为什么/如何在隔离颜色窗格的matplotlib imshow()中使用cmap参数?

每当我绘制此图像时,都会出现白色变黄的问题。我知道这是由于matplotlib使用的默认颜色映射viridis所致。当我切换到cmap ='gray'时,它最终显示右侧的红色窗格。

谁能解释为什么会这样?此类图片通常应使用什么颜色图?当我执行默认的imshow(img)时,图片如何显示正确的颜色?隔离单个颜色窗格时会有什么变化?当隔离图像中的红色绿色或蓝色窗格时,首选的cmap是什么?为什么?

Ipython笔记本

这是红色窗格的输出

常规图像根据RGB颜色模式正确绘制:

在此处输入图片说明

python numpy matplotlib opencv-python

2
推荐指数
1
解决办法
563
查看次数

detectMultiScale(a, b, c) 参数含义

OpenCV-Python 版本 3.4.1

我正在尝试通过相机检测多个物体。对象是脸、眼睛、勺子、笔。Spoon 和 Pen 是特别的,即它应该只检测我用它训练过的 Pen 和 Spoon。但是它可以检测所有类型的面部和眼睛,因为我使用了 OpenCV-Python 附带的“.xml”文件进行面部和眼睛检测。

我的问题是关于代码。下面我的代码中有一行写着detectMultiScale(gray, 1.3, 10)。现在,我使用了文档,仍然无法清楚地理解括号的最后两个参数。

我的代码:

# with camera feed
import cv2
import numpy as np

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
spoon_cascade = cv2.CascadeClassifier('SpoonCascade.xml')
pen_cascade = cv2.CascadeClassifier('PenCascade.xml')

cap = cv2.VideoCapture('link')

while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    spoons = spoon_cascade.detectMultiScale(gray, 1.3, 10)

    pens = pen_cascade.detectMultiScale(gray, 1.3, 10)

    for (x, y, w, h) in spoons:
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, 'Spoon', (x-w, y-h), …
Run Code Online (Sandbox Code Playgroud)

opencv object-detection cascade-classifier opencv3.0 opencv-python

2
推荐指数
1
解决办法
1万
查看次数