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 中基于网络摄像头的对象扫描器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章