• [技术干货] 鲲鹏服务器OpenCV的安装
    步骤一:下载Opencvgit clone -b 4.3.0 https://gitee.com/mirrors/opencv.gitcd opencvmkdir buildcd build步骤二:安装opencvcmake -D BUILD_SHARED_LIBS=ON  \-D BUILD_TESTS=OFF \-D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/home/HwHiAiUser/ascend_ddk/arm \-D WITH_LIBV4L=ON make -j8 make install步骤三:配置opencv的环境变量 export PATH=/home/HwHiAiUser/ascend_ddk/arm/bin:$PATH export LD_LIBRARY_PATH=/home/HwHiAiUser/ascend_ddk/arm/lib:$ LD_LIBRARY_PATH
  • [技术干货] 玩转Atlas 200DK(五)OpenCV的安装
    五、OpenCV的安装8、使用MindStudio运行YoLoV3样例工程我们记得上次说到OpenCV的安装比较麻烦。是因为OpenCV需要实现交叉编译,即需要在开发环境x86上编译aarch64的包,然后编译好的可执行程序需要在运行环境aarch64上运行。另外,由于mksd制卡方式和dd镜像制卡方式有点区别。dd镜像方式中很多包昇腾团队已经给我们准备好了。所以在下列的一些(shao)操作里面,张小白会特意提到,如果是mksd制卡方式,需要做哪些操作(言下之意就是,如果是dd方式,那些在200dk ubuntu 18.04 aarch环境上的一些操作就可以省略了。(1)打开YoLoV3样例工程打开一个新的YoLoV3工程,可参考:https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture会提示:此时点击OK:在弹出的菜单中再点击OK即可打开这个YoLoV3工程。此时,还是需要再配置一个deployment的:add一个server:像前面描述一样的增加 connection和mapping即可:当然,编译YoLoV3的工程代码同样也会报找不到OpenCV的问题:我们来看看怎么解决这个问题。CANN训练营的龙哥  @海中之龙  是个爱学习的好童鞋。他给张小白提供了一个解决方案:https://gitee.com/ascend/samples/blob/master/cplusplus/environment/separate_environmental_guidance_CN.md#%E5%AE%89%E8%A3%85opencv跟着好学生做应该能成功,不妨试一下吧!(2)安装OpenCV方式1:dd镜像制卡的运行环境如果是dd镜像制卡的运行环境,按以下操作进行:cd /usr/lib/aarch64-linux-gnusudo scp -r HwHiAiUser@192.168.1.2:/lib/aarch64-linux-gnu/* ./sudo scp -r HwHiAiUser@192.168.1.2:/usr/lib/aarch64-linux-gnu/* ./。。。sudo scp -r HwHiAiUser@192.168.1.2:/usr/lib/*.so.* ./# 拷贝opencv相关头文件。sudo scp -r HwHiAiUser@192.168.1.2:/usr/include/opencv /usr/include/sudo scp -r HwHiAiUser@192.168.1.2:/usr/include/opencv2 /usr/include/。。。方式2:mksd制卡的运行环境这种环境下,运行环境基本上没有开发包。所以需要在200DK上安装OpenCV:.。。x86环境copy回对应的so:cd /usr/lib/aarch64-linux-gnusudo scp -r HwHiAiUser@192.168.1.2:/lib/aarch64-linux-gnu/* ./sudo scp -r HwHiAiUser@192.168.1.2:/usr/lib/aarch64-linux-gnu/* ./sudo scp -r HwHiAiUser@192.168.1.2:/usr/lib/*.so.* ./sudo scp -r HwHiAiUser@192.168.1.2:/usr/include/opencv* /usr/include(其实仔细看看,除了需要在运行环境200DK上安装OpenCV之外,后续的拷贝动作跟mksd都是一样的。)(3)执行编译build:这里比较奇怪,前面OpenCV没报错了,但是后面又去找了 runtime的目录,这个CMakeLists.txt文件确实写得有问题,至少是不适合交叉编译使用。张小白检查了下上图中的link_librarys, 原来这个runtime目录跟实际的目录不对应:张小白做了以下的修改:(在原来的runtime目录前增加了 一层arm64-linux目录)再重新编译,成功了!(4)YoLoV3的模型转换打开 https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_pictureA、下载caffe模型需要先到200DK上执行以下命令:cd $HOME/samples/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture/modelwget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/yolov3.caffemodelwget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/yolov3.prototxtwget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/YOLOV3_coco_detection_picture/aipp_nv12.cfgB、在运行环境(200DK)的命令行中完成模型转换:atc --model=yolov3.prototxt --weight=yolov3.caffemodel --framework=0 --output=yolov3 --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfgC、将转换好的离线模型拷贝到开发环境在X86上执行:cd ~/tag/samples/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture/modelscp HwHiAiUser@192.168.1.2:/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture/model/yolov3.om .D、准备待推理的图片cd ../datawget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/YOLOV3_coco_detection_picture/dog1_1024_683.jpg --no-check-certificate(4)代码运行在MindStudio的菜单中选择Run:等了一会儿,运行结果如下:查看本地out/output目录下生成的结果图片:确实 dog 99%已在结果图中标识出来了。9、再次使用MindStudio打开venc样例工程回过头来打开dvpp的venc的项目,这个时候应该也能编译和运行了:这里面的细节就不细说了,跟前面处理的方式几乎一样。(未完待续)
  • [其他] OpenCV做两幅图像的融合
    将把文本图像与漂亮的背景图像混合在一起。让我们先来看看这两个图像: ![ce4f0d53e1cb194491d1bd284b6bb057.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/27/1651063001517117968.jpg) ![a74822baf5011f6a11c9ba58b581d087.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/27/1651063006616493518.png) bg = cv2.imread('images/background.jpg', cv2.IMREAD_COLOR) fg = cv2.imread('images/foreground.png', cv2.IMREAD_COLOR) 我们先调整图像大小,以确保它们的尺寸相同。要使融合能够正常进行,需要使用相同的大小图像。否则,它将返回错误消息。 (.shape)背景图像为853到1280像素。前景图像为1440至2560像素。我们将使用OpenCV的调整大小功能调整它们的大小。 dim = (1200, 800) resized_bg = cv2.resize(bg, dim, interpolation = cv2.INTER_AREA) resized_fg = cv2.resize(fg, dim, interpolation = cv2.INTER_AREA) 有了OpenCV,我们可以用一行代码来完成这项工作。将为我们完成混合的功能称为addWeighted。它有5个参数,可以列出为:图像源1,src1权重,图像源2,src2权重,伽玛。每个图像的权重值必须小于1。这是混合方程式: blend = (image scr1)*(src1 weight) + (image scr2)*(src2 weight) + gamma 这是函数的数学原理。让我们看看实际情况: `blend = cv2.addWeighted(resized_bg, 0.5, resized_fg, 0.8, 0.0)` 我们给前景加了一些权重。这样,背景将更暗,文本将更亮。 现在,让我们使用imwrite方法导出最终作品。这是将图像另存为文件夹中的新图像文件的行。 `cv2.imwrite('blended.png', blend)` ![e943055c4cae902df419236c8a6ba475.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/27/1651063157864826198.png)
  • [技术干货] cv2.error: OpenCV(4.5.4-dev) D:\a\opencv-python\opencv-python\op
     - 1.查看自己的路径当中是否出现中文,如果有的话修改路径 - 2.如果路径不存在问题,则要注意转义的问题     (如果路径出现"\"的话需要在路径最前边加r,意思是防止转义.)     (如果是"/"则不存在其他问题)
  • [问题求助] 【Atlas200DK】【OpenCV兼容问题】atlas200DK是否兼容OpenCV库?
    【功能模块】模块兼容问题【操作步骤&问题现象】想请问atlas200DK的芯片是否支持OpenCV库?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 如何在200DK的开发和运行分设环境下安装opencv的交叉编译环境
    参见 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=184545&ordertype=2&page=2在使用MindStudio 3.0.4 打开200DK的样例程序时,编译报了 找不到opencv的错。。这个时候需要在宿主机环境上交叉编译opencv,但不知道如何交叉编译,还烦请专家告知。谢谢~~
  • [其他] OpenCV简介
    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1]  它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。opencv是一个开源的计算机视觉开发包,这已是众所周知的了,而且越来越多的人开始研究它了。但opencv的使用者还是以高校居多,企业用得比较少,而企业使用opencv也往往是借鉴它的一些算法。计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:1、研究代码(慢,不稳定,独立并与其他库不兼容)2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。OpenCV与其它视觉函数库性能对比(来源百度百科)      作为开源软件,opencv的优势就是在于它有400多个免费的图像处理函数,而且涉及的面很广,从图像处理到模式识别、从静态图像到运动视频、从二维平面到相机的三维标定以及三维重建,覆盖了机器视觉的大多应用领域。它的许多算法,也是做了很好的优化的,比绝大多数教科书(当然指国内的教科书)算法优化得好。而国内的教科书,很多时候连一个算法也没讲明白过,更不用说到优化了。所以,用好opencv的开发包,就是一个不错的教材。
  • [MindX SDK] MindX 通过SendProtobuf将原始YUV/RGB图像发送给Pipeline问题
    - 使用MindX框架,通过SendProtobuf将原始YUV/RGB图像发送给Pipeline,通过mxpi_imageresize插件缩放到模型输入尺寸后进行检测流程。目前使用Opencv模拟输入原始YUV/RGB图像,但无论是YUV还是RGB都不能正常跑通或识别正确。 - 输出的图片如下所示,存在花屏和错位,不知道是Opencv转MxstDataInput存在问题,还是resize没用使用正确。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/23/1648023303086651621.png)
  • [其他] OpenCV 中国镜像仓库正式启用
    OpenCV 中国镜像仓:https://gitcode.net/opencvOpenCV是一个基于Apache 2.0 许可证(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、macOS、Android和iOS操作系统上。为了解决克隆 OpenCV 源码以及构建过程的下载问题,OpenCV 中国团队联系了国内一家提供代码托管服务的网站 GitCode.net,双方对 OpenCV 中国镜像的想法一拍即合,为广大 OpenCV 的开发者提供便利。这样下载就不会慢了~
  • [问题求助] atlas200dk已连接上网,但是还是Unable to locate package libopencv-dev
    已连接上网,但是还是Unable to locate package libopencv-dev
  • [其他] 使用OpenCV测量图像中物体之间的距离
    本文转自:opcv学堂本文来自光头哥哥的博客【Measuring distance between objects in an image with OpenCV】,仅做学习分享。原文链接:https://www.pyimagesearch.com/2016/04/04/measuring-distance-between-objects-in-an-image-with-opencv/已经完成了测量物体大小的任务,今天进行最后一部分:计算图片中物体之间的距离。上篇我们讨论了如何使用参考对象来测量图像中对象的大小。这个参考对象应该有两个重要的特征,包括:• 我们知道这个物体的尺寸(以英寸、毫米等表示)。• 它很容易在我们的图像中被识别出来(根据位置或外观)。给定这样一个参考对象,我们可以使用它来计算图像中对象的大小。今天,我们将结合本系列前两篇来计算对象之间的距离。计算物体之间的距离与计算图像中物体的大小算法思路非常相似——都是从参考对象开始的。我们将使用0.25美分作为我们的参考对象,它的宽度为0.955英寸。并且我们还将0.25美分总是放在图片最左侧使其容易识别。这样它就满足了我们上面提到的参考对象的两个特征。我们的目标是找到0.25美分,然后利用0.25美分的尺寸来测量0.25美分硬币与所有其他物体之间的距离。定义参考对象并计算距离打开一个新文件,将其命名为distance_between.py,插入以下代码: # import the necessary packages from scipy.spatial import distance as dist from imutils import perspective from imutils import contours import numpy as np import argparse import imutils import cv2 def midpoint(ptA, ptB): return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5) # construct the argument parse and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to the input image") ap.add_argument("-w", "--width", type=float, required=True, help="width of the left-most object in the image (in inches)") args = vars(ap.parse_args())# import the necessary packages我们这里的代码与上周的代码几乎相同。我们从在第2-8行上导入所需的Python包开始。 第12-17行解析命令行参数。这里我们需要两个参数:——image,它是包含我们想要测量的对象的输入图像的路径,以及——width,为我们参考对象的宽度(单位为英寸)。接下来,我们需要对图像进行预处理:# load the image, convert it to grayscale, and blur it slightly image = cv2.imread(args["image"]) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (7, 7), 0) # perform edge detection, then perform a dilation + erosion to # close gaps in between object edges edged = cv2.Canny(gray, 50, 100) edged = cv2.dilate(edged, None, iterations=1) edged = cv2.erode(edged, None, iterations=1) # find contours in the edge map cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # sort the contours from left-to-right and, then initialize the # distance colors and reference object (cnts, _) = contours.sort_contours(cnts) colors = ((0, 0, 255), (240, 0, 159), (0, 165, 255), (255, 255, 0), (255, 0, 255)) refObj = None第2-4行从磁盘加载图像,将其转换为灰度图,然后使用7 x 7内核的高斯滤波器对其进行模糊降噪。当我们的图像被模糊后,我们应用Canny边缘检测器来检测图像中的边缘,然后进行膨胀+腐蚀来缩小边缘图中的缝隙(第7-9行)。调用cv2.findContours检测边缘图中对象的轮廓(第11-13行),而第16行从左到右对轮廓进行排序。由于我们知道0.25美分(即参考对象)将始终是图像中最左边,因此从左到右对轮廓进行排序可以确保与参考对象对应的轮廓始终是cnts列表中的第一个。然后,我们初始化用于绘制距离的colors列表以及refObj变量,该变量将存储参考对象的边界框、质心和pixels-per-metric值(看上一篇就明白pixels-per-metric的具体定义,其实就是参考对象的实际大小(单位英寸)与图片中的宽度(单位为像素)的比值)。# loop over the contours individually for c in cnts: # if the contour is not sufficiently large, ignore it if cv2.contourArea(c) < 100: continue # compute the rotated bounding box of the contour box = cv2.minAreaRect(c) box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box) box = np.array(box, dtype="int") # order the points in the contour such that they appear # in top-left, top-right, bottom-right, and bottom-left # order, then draw the outline of the rotated bounding # box box = perspective.order_points(box) # compute the center of the bounding box cX = np.average(box[:, 0]) cY = np.average(box[:, 1])xxxxxxxxxx # loop over the contours individually# loop over the contours individuallyfor c in cnts: # if the contour is not sufficiently large, ignore itif cv2.contourArea(c) < 100:continue # compute the rotated bounding box of the contourbox = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)box = np.array(box, dtype="int") # order the points in the contour such that they appear # in top-left, top-right, bottom-right, and bottom-left # order, then draw the outline of the rotated bounding # boxbox = perspective.order_points(box) # compute the center of the bounding boxcX = np.average(box[:, 0])cY = np.average(box[:, 1])在第2行,我们开始对cnts列表中的每个轮廓进行循环。如果轮廓比较小(第4和5行),我们认为是噪声并忽略它。 然后,第7-9行计算当前对象的最小旋转包围框。第14行上调用order_points函数(此系列第一篇定义的函数)来对矩形框四个顶点以左上角、右上角、右下角和左下角的顺序排列,我们将看到,在计算物体之间的距离时,这一点非常重要。第16行和第17行通过取边界框在x和y方向上的平均值来计算旋转后的边界框的中心(x, y)坐标。下一步是校准我们的refObj:# if this is the first contour we are examining (i.e., # the left-most contour), we presume this is the # reference object if refObj is None: # unpack the ordered bounding box, then compute the # midpoint between the top-left and top-right points, # followed by the midpoint between the top-right and # bottom-right (tl, tr, br, bl) = box (tlblX, tlblY) = midpoint(tl, bl) (trbrX, trbrY) = midpoint(tr, br) # compute the Euclidean distance between the midpoints, # then construct the reference object D = dist.euclidean((tlblX, tlblY), (trbrX, trbrY)) refObj = (box, (cX, cY), D / args["width"]) continue如果refObj为None(第4行),则需要对其进行初始化。 我们首先获取(排序后的)最小旋转边界框坐标,并分别计算四个顶点之间的中点(第10-15行)。然后计算中点之间的欧氏距离,给出我们的“像素/尺寸”比例,来确定一英寸为多少像素宽度。最后,我们将refObj实例化为一个3元组,包括:• 物体对象的最小旋转矩形对象box• 参考对象的质心。• 像素/宽度比例,我们将用其来结合物体之间的像素距离来确定物体之间的实际距离。下一个代码块负责绘制参考对象和当前检查对象的轮廓,然后定义变量refCoords和objCoords,这样(1)最小包围矩阵坐标和(2)质心的(x, y)坐标都包含在同一个数组中:# draw the contours on the image orig = image.copy() cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 2) cv2.drawContours(orig, [refObj[0].astype("int")], -1, (0, 255, 0), 2) # stack the reference coordinates and the object coordinates # to include the object center refCoords = np.vstack([refObj[0], refObj[1]]) objCoords = np.vstack([box, (cX, cY)])现在我们可以开始计算图像中各个物体的质心和质心之间的距离了: # loop over the original points for ((xA, yA), (xB, yB), color) in zip(refCoords, objCoords, colors): # draw circles corresponding to the current points and # connect them with a line cv2.circle(orig, (int(xA), int(yA)), 5, color, -1) cv2.circle(orig, (int(xB), int(yB)), 5, color, -1) cv2.line(orig, (int(xA), int(yA)), (int(xB), int(yB)), color, 2) # compute the Euclidean distance between the coordinates, # and then convert the distance in pixels to distance in # units D = dist.euclidean((xA, yA), (xB, yB)) / refObj[2] (mX, mY) = midpoint((xA, yA), (xB, yB)) cv2.putText(orig, "{:.1f}in".format(D), (int(mX), int(mY - 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.55, color, 2) # show the output image cv2.imshow("Image", orig) cv2.waitKey(0)在第2行,我们开始对图片中物体对象的顶点(x, y)坐标进行循环。 然后我们画一个圆表示我们正在计算距离的当前点坐标,并画一条线连接这些点(第5-7条线)。然后,第12行计算参考位置和对象位置之间的欧式距离,然后除以“像素/度量”,得到两个对象之间的实际距离(以英寸为单位)。然后在图像上标识出计算的距离(第13-15行)。距离测量结果下面是一个GIF动画,演示了我们的程序运行效果: 在每种情况下,我们的脚本都匹配左上(红色)、右上(紫色)、右下(橙色)、左下(蓝绿色)和质心(粉色)坐标,然后计算参考对象和当前对象之间的距离(以英寸为单位)。注意图像中的两个0.25美分完全平行,这意味着所有五个顶点之间的距离均为6.1英寸。下面是第二个例子,这次计算的是参考对象和药丸之间的距离: 这个例子可以作为药片分类机器人的输入,自动获取一组药片,并根据它们的大小和与药片容器的距离来组织它们。 最后一个例子计算了我们的参考对象(一张3.5英寸x 2英寸的名片)和一组7英寸的黑胶唱片和信封之间的距离:
  • [问题求助] 【Atlas300】【C++ ImageData转cv::Mat】将ImageData转cv::Mat用于opencv处理
    你好,我在Atlas300上使用AtlasVideoCapture读取网络摄像头,大致流程如下:AtlasVideoCapture* cap_;cap_ = new AtlasVideoCapture(streamName_)ImageData image;Atlas Error ret = cap_->Read(image)得到ImageData结构的image,其结构如下:struct ImageData { acldvppPixelFormat format; uint32_t width = 0; uint32_t height = 0; uint32_t alignWidth = 0; uint32_t alignHeight = 0; uint32_t size = 0; std::shared_ptr<uint8_t> data = nullptr;};接下来需要将image中的数据转为cv::Mat,该如何操作呢?
  • [其他] 使用OpenCV为视频中美女加上眼线
    计算机视觉是最令人兴奋的领域之一,其应用范围非常广泛。从医学成像到创建最有趣的面部滤镜等各个领域都充分见证了计算机视觉技术的强大。在本文中,我们将尝试创建一个人造眼线笔来模仿Snapchat或Instagram滤波器,为视频中的美女添加上美丽的眼线。最终的结果可以通过下面的动图观察到。本文介绍的内容适合想要通过计算机视觉来实现一个具有一定展示性功能的计算机视觉初学者。因此,在本文重我们会尽量简化说明,如果您对完整的程序感兴趣,可以在Github上找到完整的代码。Github的链接在本文的文末给出。 在实现本文功能之前,我们需要设置一个新的虚拟环境并安装所有必需的依赖项。这个过程比较简单,我们也在Github里面给出了如何配置环境的具体过程。在本项目中,我们需要使用的工具有OpenCV,NumPy,imutils,SciPy和Dlib。有些小伙伴可能对这些工具和库比较陌生,接下来我们简单介绍一下每个模块的作用。• OpenCV:用于图像处理的最受欢迎的模块之一。我们将使用OpenCV读取,写入和绘制图像。• NumPy:在处理OpenCV项目时经常使用NumPy。图像本质上是一个像素数组,OpenCV使用以NumPy数组形式存储的这些数组,并对图像执行操作。• Imutils:Imutils附带了自定义功能,使我们的计算机视觉工作变得更加轻松。在这里,我们将使用它来将dlib对象转换为非常灵活且广泛接受的numpy数组。• Scipy:顾名思义,SciPy用于python上的科学计算。我们将使用它来创建插值(如果现在没有意义,可以的)。• Dlib:Dlib是一个包含各种ML算法的C ++库。我们将使用dlib提取面部界标点。项目简要介绍该程序首先从每个面孔中提取68个界标点。在这68个点中,点37–42属于左眼,点43–48属于右眼,具体形式如下图所示。因为我们的目标是给面部添加眼线,所以我们只对37-48点感兴趣,因此我们提取了这些点。我们将对这些提取的点进行插值。插值意味着我们尝试在两个给定点之间插入点。我们可以使用的插值方式如下图所示。眼线算法的流程图如下所示接下来,我们将进一步详细描述该算法。如果小伙伴只对运行代码感兴趣,可以跳至最后一部分。算法介绍我们首先需要提取脸部周围边界框的坐标。OpenCV将图像转换为NumPy数组。numpy.array(即图像的矩阵表示形式)存储在名为的变量中frame。我们使用一个名为face_detector()的函数,该函数返回围绕框架中所有脸部的包围框的坐标。这些边界框坐标存储在一个名为bounding_boxes的变量中。遍历循环bounding_boxes以将眼线应用于帧中检测到的每个脸部。face_landmark_points存储68个坐标点。eye_landmark_points是从getEyeLandmarkPts()函数中得到。getEyeLandmarkPts()函数使用68个坐标点作为输入并返回具有左上眼睑的坐标4个矩阵,左上眼线(L_eye_top),左下眼线(L_eye_bottom)和相同的右眼(R_eye_top & R_eye_bottom)。这可以通过简单的NumPy索引完成的。我们将端点(pt号37、40、43和46。请参见68个界标点图)向外移动5px,以使外观更逼真。现在,我们需要对这些点进行插值以获得平滑的曲线,进而可以画出眼线。我们需要对每个曲线进行不同的处理(即L_eye_top,L_eye_bottom,R_eye_top,R_eye_bottom)。因此,我们为每个曲线使用单独的变量名称。interpolateCoordinates()用于在每条曲线上生成插值。重复使用该函数,为每个曲线生成插值坐标。这个函数为每个曲线返回一个插值点数组。drawEyeLiner()函数将生成的插值点作为参数,并在两个连续点之间画一条线。在两个循环中为每个曲线完成此操作,一个循环用于左眼,另一个循环用于右眼。 调用项目该项目的用发非常简单,首先从Github上克隆到本地 git clone https://github.com/kaushil24/Artificial-Eyeliner/接下来,打开命令提示符并键入以下代码以运行示例测试python3 eyeliner.py -v "Media/Sample Video.mp4"我们也可以通过将视频路径放在参数中来使用自己的视频。完整的CLI命令如下:python eyeliner.py [-i image] [-v video] [-d dat] [-t thickness] [-c color] [-s save]每个参数的具体含义如下:• i :要在其上绘制眼线的图像的路径• v :要在其上绘制眼线的视频的路径。• v :也可以通过网络摄像头获取视频。例如:python3 -v webcam -s "Webcam output"• t :整数(整数)以设置眼线的厚度。默认值= 2。推荐的数值介于1-5之间• d:shape_predictor_68_face_landmarks.dat文件的路径。默认路径在根目录中。除非将shape_predictor_68_face_landmarks.dat文件存储在其他位置,否则不需要使用此参数。• c :更改眼线的颜色。语法-c 255 255 255。默认值= 0 0 0。其中每个数字代表其RGB值。• s :要将输出保存到的位置和文件名。注意程序在保存文件时会自动添加扩展名。如果已经存在同名文件,它将覆盖该文件。转载自小白学视觉公众号
  • [其他] 基于OpenCV的实时面部识别
    现在,面部识别已成为生活中的一部分。因此,在介绍主题之前我们先看看实时面部识别示例。我们在手机、平板电脑等设备中使用人脸信息进行解锁的时候,这时就要求获取我们的实时面部图像,并将其储存在数据库中以进一步表明我们的身份。 通过对输入图像进行迭代和预测可以完成这个过程。同样,实时人脸识别可与OpenCV框架python的实现配合使用。再将它们组合在一个组合级别中,以实现用于实时目的的模型。 人脸识别 “面部识别”名称本身就是一个非常全面的定义,面部识别是通过数字媒体作为输入来识别或检测人脸的技术执行过程。人脸识别的准确性可以提供高质量的输出,而不是忽略影响其的问题因素。在这里,要确保运行我们的模型,必须确保在本地系统中安装了库。pip install face_recognition如果在 face_recognition库的安装过程中遇到一些问题或错误,可以点击以下链接:https://www.youtube.com/watch?v=xaDJ5xnc8dc人脸识别本身无法提供清晰的输出,因此出现了OpenCV实现的概念。OpenCV OpenCV是python中一个著名的库,用于实时应用程序。OpenCV在计算机世界中就像树的根一样非常重要。face_recognition中的OpenCV对我们训练为输入的面部图像进行聚类和特征提取。它以图像中的地标为目标,以迭代方式在计算机视觉的深度学习方法中训练它们。在本地系统中安装OpenCVpip install opencv-python使用深度学习算法,OpenCV检测可作为聚类,相似性检测和图像分类的表示。为什么我们使用OpenCV作为实时Face_Recognition中的关键工具? 人类可以轻松检测到面部,但是我们如何训练机器识别面部?OpenCV在这里填补了人与计算机之间的空白,并充当了计算机的愿景。以一个实时的例子为例,当一个人遇到新朋友时,他会记住这些人的脸,以备将来识别。一个人的大脑反复训练后端的人脸。因此,当他看到那个人的脸时,他说:“嗨,约翰!你好吗?”。对面部的识别和可以为计算机提供与人类相同的思维方式。OpenCV是计算机视觉中的重要工具。如果我们使用OpenCV,则遵循以下步骤:• 通过输入提取数据。• 识别图像中的面部。• 提取独特的特征,以建立预测思想。• 该特定人的性格特征,如鼻子,嘴巴,耳朵,眼睛和面部主要特征。• 实时人脸识别中人脸的比较。• 识别出的人脸的最终输出。使用OpenCV python的Face_Recognition: 代码下载:https://github.com/eazyciphers/deep-machine-learning-tutors/tree/master/Real-Time Face RecognitionGitHub导入所有软件包:import face_recognitionimport cv2import numpy as np加载并训练图像:# Load a sample picture and learn how to recognize it. Jithendra_image = face_recognition.load_image_file("jithendra.jpg") Jithendra_face_encoding = face_recognition.face_encodings(Jithendra_image)[0] # Load a sample picture and learn how to recognize it. Modi_image = face_recognition.load_image_file("Modi.jpg") Modi_face_encoding = face_recognition.face_encodings(Modi_image)[0]人脸编码:# Create arrays of known face encodings and their names known_face_encodings = [ Jithendra_face_encoding, Modi_face_encoding, ] known_face_names = [ "Jithendra", "Modi" ]主要方法:当实时人脸识别为true时,它将检测到人脸并按照代码中的以下步骤操作:• 抓取实时视频中的一帧。• 将图像从BGR颜色(OpenCV使用的颜色)转换为RGB颜色(face_recognition使用的颜色)• 在实时视频的帧中找到所有面部和面部编码。• 循环浏览此视频帧中的每个面孔,并检查该面孔是否与现有面孔匹配。• 如果一个人脸无法识别现有人脸,则将输出视为未知或未知。• 识别后,否则在识别出的脸部周围画一个方框。• 用其名称标记识别的面部。• 识别后显示结果图像。退出:# Hit 'q' on the keyboard to quit! if cv2.waitKey(1) & 0xFF == ord('q'): break释放摄像头的手柄:# Release handle to the webcam video_capture.release() cv2.destroyAllWindows()输入和输出 在训练过程中提供给模型的样本输入…。输入用于训练代码的样本图像样本输入图像进行训练输出
  • [其他] 基于OpenCV的条形码区域分割
    分割是识别图像内一个或多个对象的位置的过程。我们要介绍的技术其实非常简单,它利用了形态算子的扩张和侵蚀,以及诸如开运算,闭运算和黑帽算子的组合。01.简介安装Anaconda后,让我们从Anaconda的提示符下使用以下命令转到OpenCV安装:conda install -c https://conda.anaconda.org/menpo opencv现在,让我们从Anaconda启动器启动Spyder IDE。Anaconda启动器一旦运行了Spyder,建议验证OpenCV安装是否成功。在Python控制台的右下角,我们进行以下测试:import cv2代码讲解我们已经创建了一个启动GitHub存储库。小伙伴可以使用以下方法直接克隆它:git clone --branch step1 https://github.com/lucapiccinelli/BarcodesTutorial.git现在,我们将要下载测试图像,并对他们进行读取和显示。import cv2 import matplotlib.pyplot as plt im = cv2.imread(r’img\barcodes.jpg’, cv2.IMREAD_GRAYSCALE) plt.imshow(im, cmap=’Greys_r’)接下来,我们将对图像进行二值化处理,这样可以通过阈值的设定来提取出我们感兴趣的部分。使用黑帽运算符,我们可以增加较暗的图像元素。我们可以首先使用简单的全局阈值安全地对图像进行二值化处理。黑帽运算符使我们可以使用非常低的阈值,而不必过多地关注噪声。在应用blackhat时,我们使用的内核会更加重视垂直图像元素。内核具有固定的大小,因此可以缩放图像,这也可以提高性能(并支持某种输入归一化)。黑帽+阈值处理它遵循其他形态运算符的采用,顺序地将它们组合在一起以获得条形码位置中的连接组件。#riscalatura dell'immagine scale = 800.0 / im.shape[1] im = cv2.resize(im, (int(im.shape[1] * scale), int(im.shape[0] * scale))) #blackhat kernel = np.ones((1, 3), np.uint8) im = cv2.morphologyEx(im, cv2.MORPH_BLACKHAT, kernel, anchor=(1, 0)) #sogliatura thresh, im = cv2.threshold(im, 10, 255, cv2.THRESH_BINARY)膨胀和闭合的这种组合在测试图像上效果很好,但可能无法在其他图像上达到相同的效果。这没有关系,大家可以尝试改变参数和运算符的组合,直到对结果满意为止。膨胀+闭运算最后的预处理步骤是应用具有很大内核的开运算符,以删除太少而无法适合条形码形状的元素。kernel = np.ones((21, 35), np.uint8) im = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel, iterations=1)这是我们希望得到的最终结果:使用35x21内核打开现在,我们可以运行连接的组件的检测算法,并检索带有坐标和尺寸的条形码矩形。如大家在上一张图像中所看到的那样,最后的形态学步骤并未滤除全部的噪声。但是,在这种情况下,将它们过滤掉非常简单,以矩形区域值作为阈值就可以了。#rilettura dell'immagine, stavolta a colori im_out = cv2.imread(r'img\barcodes.jpg') #estrazione dei componenti connessi contours, hierarchy = cv2.findContours(im, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) unscale = 1.0 / scale if contours != None: for contour in contours: # se l'area non è grande a sufficienza la salto if cv2.contourArea(contour) <= 2000: continue #estraggo il rettangolo di area minima (in formato (centro_x, centro_y), (width, height), angolo) rect = cv2.minAreaRect(contour) #l'effetto della riscalatura iniziale deve essere eliminato dalle coordinate rilevate rect = \ ((int(rect[0][0] * unscale), int(rect[0][1] * unscale)), \ (int(rect[1][0] * unscale), int(rect[1][1] * unscale)), \ rect[2]) #disegno il tutto sull'immagine originale box = np.int0(cv2.cv.BoxPoints(rect)) cv2.drawContours(im_out, [box], 0, (0, 255, 0), thickness = 2) plt.imshow(im_out) #scrittura dell' immagine finale cv2.imwrite(r'img\out.png', im_out)最后,在上面的代码中,我使用提取的矩形绘制它们,并将其覆盖在原始图像上。最终结果,条形码以绿色框突出显示。结论• 提出的技术非常简单有效,但存在一些令人讨厌的缺点:• 它对条形码偏斜非常敏感;它可以很好地工作到大约45度,然后您必须执行第二遍,修改内核的方向。• 它只能在固定尺寸范围内找到条形码。• 尽管对矩形区域施加了过滤,但仍有可能无法清除某些非条形码。第一个和第二个可能不是真正的问题,但是最后一个可能会花费大家大量时间来尝试解码非条形码的内容。一个很好的解决方案是将条形码特征(图像梯度,傅立叶变换)输入给神经网络(或一些其他一些分类器),并在第二时刻过滤掉噪声。
总条数:305 到第
上滑加载中