C# 9/10 .net 6 中基于网络摄像头的对象扫描器 [关闭]

Posted

技术标签:

【中文标题】C# 9/10 .net 6 中基于网络摄像头的对象扫描器 [关闭]【英文标题】:Webcam based object Scanner in C# 9/10 .net 6 [closed] 【发布时间】:2022-01-07 01:26:10 【问题描述】:

我正在尝试将此 Python 代码从 theDataFox card_scanner_app 移植到 C# WPF 应用程序。

Python 程序使用网络摄像头识别对象(交易卡)并通过按空格键对对象进行快照。 据我所知,代码散列快照并将其与已散列的 64.000 张图像的数据库进行比较。

然后代码使用图像文件名中给出的图像 ID 并从数据库生成输出,其中包含有关此特定对象的所有信息。

import cv2
import pygame
import imutils
import numpy as np
import pygame.camera
from pygame.locals import KEYDOWN, K_q, K_s, K_SPACE
from . import util
import argparse
import glob

DEBUG = False

# calibrate this for camera position
MIN_CARD_AREA = 250000.0 / 3

# calibrate these
THRESHOLD = (100, 255)
FILTER = (11, 17, 17)

ROTATION = 0

# noinspection PyUnresolvedReferences
def scan(img):
    # preprocess image
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.bilateralFilter(gray, FILTER[0], FILTER[1], FILTER[2])
    ret, gray = cv2.threshold(gray, THRESHOLD[0], THRESHOLD[1], cv2.THRESH_BINARY)
    edges = imutils.auto_canny(gray)

# extract contours
cnts, _ = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = [c for c in cnts if cv2.contourArea(c) >= MIN_CARD_AREA]

card, c = None, None
if cnts:
    # get largest contour
    c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]

    # approximate the contour
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.05 * peri, True)
    pts = np.float32(approx)

    x, y, w, h = cv2.boundingRect(c)

    # Find center point of card by taking x and y average of the four corners.
    # average = np.sum(pts, axis=0)/len(pts)
    # cent_x = int(average[0][0])
    # cent_y = int(average[0][1])
    # center = [cent_x, cent_y]

    # Warp card into 200x300 flattened image using perspective transform
    card = util.flattener(img, pts, w, h)
    card = util.cv2_to_pil(card).rotate(ROTATION)
return card, c, gray, edges


# noinspection PyUnresolvedReferences
def detect(on_detect):
    dim = (800, 600)
    pygame.init()
    pygame.camera.init()
    cams = pygame.camera.list_cameras()
# print(cams)
display = pygame.display.set_mode(dim, 0)
cam = pygame.camera.Camera(cams[-1], dim)
cam.start()


capture = True
while capture:
    img = cam.get_image()
    img = pygame.transform.scale(img, dim)
    img = util.pygame_to_cv2(img)
    card, c, gray, edges = scan(img)


    # q to quit
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_q:
                capture = False
            elif event.key == K_s or event.key == K_SPACE:
                if card is None:
                    print('nothing found')
                else:
                    on_detect(card)

    # display
    if c is not None:
       cv2.drawContours(img, [c], -1, (0, 0, 255), 3)
    img = util.cv2_to_pygame(img)
    display.blit(img, (0, 0))
    pygame.display.update()

    if card is not None:
        card_img = util.pil_to_pygame(card)
        display.blit(card_img, (0, 0))

    if DEBUG:
        for layer in [gray, edges]:
            layer = cv2.cvtColor(layer, cv2.COLOR_GRAY2RGB)
            layer = util.cv2_to_pygame(layer)
            layer.set_alpha(100)
        display.blit(layer, (0, 0))

    pygame.display.flip()

cam.stop()
pygame.quit()

现在我正在尝试找到一种解决方案,以使用 C# (Visual Studio) 获得类似的网络摄像头访问权限。

至于我还是个初学者,我不知道该怎么做。

我尝试了几个 NuGet 包,但没有任何效果。我想我的技能还不够好。

因此我现在不得不问你,你有什么想法或解决方案可以完成给定的任务吗?

我已经移植了大部分程序并且运行良好。 This is my full Code

【问题讨论】:

OpenCV 有 VideoCapture,可以从摄像头设备中读取。该 API 类似于 pygame 的相机,用于您的 python 代码。 -- OpenCV 有一些 C# 包装器:opencvsharp、emgucv。就用那些。您将拥有与 OpenCV 的(官方)python 绑定所拥有的大部分 API 相同的 API。 【参考方案1】:

在c#中没有直接内置的网络摄像头api,你可以得到最接近的是UWP video capture API。当我尝试这个时,它在我的网络摄像头上效果不佳,但可能只是我自己。

有很多内置网络摄像头支持的图像处理库。这包括 OpenCV/emguCV,但也包括 aforge。

我使用了一个“versatile webcam library”,它是原生网络摄像头 API 的包装器,它似乎运行良好。

或多或少所有的库都有很好的文档以及如何获取图像的很好的示例,许多还具有演示如何使用该库的示例应用程序,这应该足以让您入门。所以“我试过了,但没用”不是一个好的解释。 什么你试过了吗? 为什么它不起作用?

【讨论】:

以上是关于C# 9/10 .net 6 中基于网络摄像头的对象扫描器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

.NET 神经网络或 AI 用于未来预测

在 C# 中获取网络摄像头的当前状态

如何使用 C# 流式传输网络摄像头视频? [关闭]

编程题 熟悉C#和WPF语言大侠帮助一下

C# 窗口中的 C++ opencv 应用程序

以高分辨率从网络摄像头捕获图片,同时使用 DirectShow.Net 以较低的分辨率进行预览