精华内容
下载资源
问答
  • Opencv图片比对

    2016-11-22 16:42:32
    Opencv图片比对,已经实现了简单的图片比对
  • ImageMatcher 基于OpenCV图片比对 支持Mac OSX 64 bit、Windows 32/64 bit、Linux 32/64 bit、Android arm.
  • 基于golang的opencv人脸比对

    万次阅读 2018-03-20 17:34:38
    github上golang结合opencv:https://github.com/go-opencv/go-opencv下载后进入go-opencv/samples目录,目录下为示例代码编译opencv源码:http://blog.csdn.net/zhjinw/article/details/79627454试运行go run ...

    github上golang结合opencv:https://github.com/go-opencv/go-opencv

    下载后进入go-opencv/samples目录,目录下为示例代码

    编译opencv源码:http://blog.csdn.net/zhjinw/article/details/79627454

    试运行go run hellocv.go

    如果出现以下错误,即没有找到opencv头文件,到mingw安装目录下的include文件夹,查看是否存在opencv和opencv2的文件夹,如果没有,到opencv编译目录include以及moudles下拷贝


    如果出现以下错误,即没有找到opencv的相关dll动态库,到mingw安装目录下的bin文件夹,查看是否有libopencv_core等相关dll文件,如果没有,到opencv编译目录bin文件夹中拷贝过来。

    这里需要注意以下,我们编译的是opencv2.4.9,源码中为opencv2.4.2,需要将源码中的

    #cgo windows LDFLAGS: -lopencv_core242 -lopencv_imgproc242 -lopencv_photo242 -lopencv_highgui242 -lstdc++

    改为:

    //#cgo windows LDFLAGS: -lopencv_core249 -lopencv_imgproc249 -lopencv_photo249 -lopencv_highgui249 -lstdc++
    将242改为249即可

    运行成功后的结果如下所示


    接下来我们使用opencv来进行人脸比对,由于我也是初次接触opencv,没有找到opencv直接提供的人脸比对接口,这里我们采用以下方法来实现人脸比对,代码中存在很多异常,我们只是进行功能验证。

    1. 分别用facedetect功能将两张图片中的人脸检测出来
    2. 将这两张人脸图片转换成单通道的图像
    3. 使用直方图比较这两张单通道的人脸图像,得出相似度。
    code:
    package main
    /*
    #include <stdio.h>
    #include <stdlib.h>
    
    static float **test(){
            float *a = malloc(2*sizeof(float));
            float **b = malloc(1*sizeof(a));
            *a = 0;
            *(a + 1) = 255;
            b[0] = a;
            return b;
    }
    */
    //#include "../opencv/opencv.h"
    //#cgo linux  pkg-config: opencv
    //#cgo darwin pkg-config: opencv
    //#cgo freebsd pkg-config: opencv
    //#cgo windows LDFLAGS: -lopencv_core249 -lopencv_imgproc249 -lopencv_photo249 -lopencv_highgui249 -lstdc++
    import "C"
    import (
    	"unsafe"
    	"fmt"
    	"path"
    	"runtime"
    
    	"github.com/lazywei/go-opencv/opencv"
    	//"../opencv" // can be used in forks, comment in real application
    )
    
    func main() {
    	_, currentfile, _, _ := runtime.Caller(0)
    	
    	HistogramBins := 256
    
    	image1 := opencv.LoadImage(path.Join(path.Dir(currentfile), "../images/111.jpg"))
    	
    	cascade := opencv.LoadHaarClassifierCascade(path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml"))
    	cascade.DetectObjects(image1)
    	
    	image2 := opencv.LoadImage(path.Join(path.Dir(currentfile), "../images/222.jpg"))
    	
    	cascade = opencv.LoadHaarClassifierCascade(path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml"))
    	cascade.DetectObjects(image2)
    
    	histogram1 :=  (*C.CvHistogram)(C.cvCreateHist(1, (*C.int)(unsafe.Pointer(&HistogramBins)), C.CV_HIST_ARRAY, C.test(), 1));
    	histogram2 :=  (*C.CvHistogram)(C.cvCreateHist(1, (*C.int)(unsafe.Pointer(&HistogramBins)), C.CV_HIST_ARRAY, C.test(), 1));
    
    	srcImage := opencv.CreateImage(image1.Width(), image1.Height(), image1.Depth(), 1)
    	opencv.CvtColor(image1, srcImage, C.CV_BGR2GRAY)
    
    	tarImage := opencv.CreateImage(image2.Width(), image2.Height(), image2.Depth(), 1)
    	opencv.CvtColor(image2, tarImage, C.CV_BGR2GRAY)
    
    	C.cvCalcHist((**C.IplImage)(unsafe.Pointer(&srcImage)), histogram1, 0, nil)
    	C.cvCalcHist((**C.IplImage)(unsafe.Pointer(&tarImage)), histogram2, 0, nil)
    	
        C.cvNormalizeHist(histogram1, 1);  
        C.cvNormalizeHist(histogram2, 1);  
    
    	fmt.Println(C.cvCompareHist(histogram1, histogram2, C.CV_COMP_CORREL))	
    
    	C.cvReleaseHist(&histogram1)
    	C.cvReleaseHist(&histogram2)
    
    	opencv.WaitKey(0)
    }

    最后进行功能验证,如果两张图片相同,得出的结果为1,如果两张图片的人脸相似度越高,则越趋向于1

    展开全文
  • 1.算法描述读取两张图像,生成图像矩阵,以两个图像矩阵为基础,调用OpenCV的相关函数完成人脸定位。读取两张图像的人脸区域,生成人脸图像矩阵,并将人脸矩阵转换为灰度图比较分析人脸图像矩阵,找到最相近的人脸。...

    一、目的

    通过某人的一张照片,在他与别人的合影中找到他。

    1.算法描述

    读取两张图像,生成图像矩阵,以两个图像矩阵为基础,调用OpenCV的相关函数完成人脸定位。

    读取两张图像的人脸区域,生成人脸图像矩阵,并将人脸矩阵转换为灰度图

    比较分析人脸图像矩阵,找到最相近的人脸。

    2.比较算法使用欧氏距离算法

    在进行人脸识别是,可使用标准欧氏距离算法。算法基本原理是:

    将标准欧氏距离算法作为比较分析人脸图像矩阵方法。

    首先,将两个人脸调整为指定大小;

    接着,用所包含像素的三元色数值组成特征组,然后将特征组映射为高维空间的某个点(在此称之为特征点);

    最后,计算两个人脸图像的特征点映射到高维空间后的距离,以欧氏距离最小者为最匹配的人脸。

    二、代码

    下面代码需要OPENCV的data库,在代码中需要指向opencv的data位置。

    git clone https://github.com/opencv/opencv

    # -*- coding: utf-8 -*-

    # code:

    # 11-2.py

    # 标准欧氏距离实现的人脸识别

    import cv2

    import numpy as np

    print('loding...')

    OPCV_PATH = r"D:/tools/opencv/sources/data/haarcascades"

    def get_EuclideanDistance(x, y):

    myx = np.array(x)

    myy = np.array(y)

    return np.sqrt(np.sum((myx - myy) * (myx - myy))) * np.var(myx - myy)

    def get_distance(img, findimg):

    newsize = (img.shape[1], img.shape[0])

    fimg = cv2.resize(findimg, newsize)

    my_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # my_fimg=cv2.cvtColor(fimg,cv2.COLORBGR2GRAY)

    my_fimg = cv2.cvtColor(fimg, cv2.COLOR_BGR2GRAY)

    return get_EuclideanDistance(my_img, my_fimg)

    color = (0, 0, 0) # 设置人脸框的颜色

    def findface(src, index):

    image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

    cv2.equalizeHist(image, image) # 灰度图像进行直方图等距化

    # 加载OpenCv的面部特征库

    classfier = cv2.CascadeClassifier(OPCV_PATH + "/haarcascade_frontalface_alt.xml")

    # 找到人脸的位置

    # 设定最小图像的大小

    divisor = 8

    h = image.shape[1]

    w = image.shape[0]

    minSize = (int(w / divisor), int(h / divisor)) # 这里加了一个取整函数

    rect = classfier.detectMultiScale(image, 1.2, 2, cv2.CASCADE_SCALE_IMAGE, minSize)

    if len(rect) > 0: # 如果人脸数组长度大于0

    for faceRect in rect: # 对每一个人脸画矩形框

    x, y, w, h = faceRect

    cv2.rectangle(image, (x, y), (x + w, y + h), color)

    cv2.imshow('img' + str(index), image)

    result = []

    for r in rect:

    result.append([(r[0], r[1]), (r[0] + r[2], r[1] + r[3])])

    print(result)

    return result

    search_file = 'search.jpg'

    origin_file = 'origin.jpg'

    origin_img = cv2.imread(origin_file)

    search_img = cv2.imread(search_file)

    # 获取人脸在图像中的坐标

    origin_result = findface(origin_img, 1)[0]

    origin_img_crop = origin_img[origin_result[0][1]:origin_result[1][1], origin_result[0][0]:origin_result[1][0], :]

    cv2.rectangle(origin_img, origin_result[0], origin_result[1], (255, 0, 255))

    search_result = findface(search_img, 2)

    # 比较第1张脸

    tmp = search_img[search_result[0][0][1]:search_result[0][1][1], search_result[0][0][0]:search_result[0][1][0], :]

    distance_face1 = get_distance(origin_img_crop, tmp)

    print('distance1 = %f' % distance_face1)

    cv2.imshow('1', tmp)

    # 比较第2张脸

    tmp = search_img[search_result[1][0][1]:search_result[1][1][1], search_result[1][0][0]:search_result[1][1][0], :]

    distance_face2 = get_distance(origin_img_crop, tmp)

    print('distance2 = %f' % distance_face2)

    cv2.imshow('2', tmp)

    if distance_face1 < distance_face2:

    cv2.rectangle(search_img, search_result[0][0], search_result[0][1], (255, 0, 255))

    else:

    cv2.rectangle(search_img, search_result[1][0], search_result[1][1], (255, 0, 255))

    cv2.imshow('search', search_img)

    cv2.imshow('origin', origin_img)

    cv2.waitKey()

    cv2.destroyAllWindows()

    原始图片:

    23d3b07f16964c96a690b722b3ac694a

    从下面的图中找到他:

    e181c04b51fe4df5983039ca753ed7d5

    运行效果:

    052fdbe64d484e0099989b6c132f570b

    展开全文
  • Python使用OPencv进行图片像素比对,Python使用OPencv进行图片像素比对,Python使用OPencv进行图片像素比对,Python使用OPencv进行图片像素比对
  • 机器视觉缺陷检测实验一、实验目的(1)利用python编写程序实现对图像的缺陷检测;(2)通过轮廓对比检测出合格产品与不合格产品;(3)实现在图像上显示文本提示信息;二、题目描述(1)读取标准图像并显示;(2)...

    机器视觉缺陷检测实验

    一、实验目的

    (1)利用python编写程序实现对图像的缺陷检测;

    (2)通过轮廓对比检测出合格产品与不合格产品;

    (3)实现在图像上显示文本提示信息;

    二、题目描述

    (1)读取标准图像并显示;

    (2)利用for循环读取待测的对比图像;

    (3)将标准图像与一张待测图像进行中值滤波、图像差分、灰度化处理、轮廓提取、最后提取轮廓总数;

    (4)将合格产品的轮廓数进行提炼,采用if语句利用轮廓数判断待测图像是否合格;

    (5)在合格图像上显示“合格”字样的提示信息,不合格则在相应图像上显示“不合格”。

    三、实现过程及运行效果

    实验标准图像如下:

    1785250-20200404175113024-876686731.png

    图3.1标准图像

    实验步骤:

    (1)读取标准图像并利用for循环读取待测的对比图像;

    (2)将标准图像与一张待测图像进行中值滤波、图像差分、灰度化处理、轮廓提取、最后提取轮廓总数;

    代码实例:

    import cv2

    import numpy as np

    from PIL import Image, ImageDraw, ImageFont

    minThres = 6

    # 读取图像1

    img=cv2.imread('0.bmp')#读取标准图像

    cv2.imshow('YuanTu',img)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    for i in range(1,6):

    imgi=cv2.imread('{}.bmp'.format(i))#依次读取待测图像

    #中值滤波

    img1 = cv2.medianBlur(img,15)

    # 图像差分

    diff = cv2.absdiff(img1, imgi)

    #灰度图

    gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)

    # 二值化

    _,thres = cv2.threshold(gray,minThres,255,cv2.THRESH_BINARY)

    # 查找轮廓

    contours,hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    (3)将合格产品的轮廓数进行提炼,采用if语句利用轮廓数判断待测图像是否合格;

    代码实例:

    if len(contours)>1000:

    print('合格')

    else:

    Print(‘不合格’)

    (4)在合格图像上显示“合格”字样的提示信息,不合格则在相应图像上显示“不合格”。

    代码实例:

    if len(contours)>1000:

    print('合格')

    #在图像上显示是否合格

    src1 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))

    font = ImageFont.truetype('simsun.ttc', 30)

    # 文字输出位置

    position = (5,5)

    # 输出内容

    str = '合格'

    draw = ImageDraw.Draw(src1)

    draw.text(position, str, font=font, fill=(255, 0, 0))

    src1 = cv2.cvtColor(np.asarray(src1), cv2.COLOR_RGB2BGR)

    cv2.imshow("CeShi",src1)

    cv2.waitKey(0)

    else:

    print('不合格')

    #在图像上显示是否合格

    src2 = Image.fromarray(cv2.cvtColor(imgi, cv2.COLOR_BGR2RGB))

    font = ImageFont.truetype('simsun.ttc', 30)

    # 文字输出位置

    position = (5,5)

    # 输出内容

    str = '不合格'

    draw = ImageDraw.Draw(src2)

    draw.text(position, str, font=font, fill=(255, 0, 0))

    src2 = cv2.cvtColor(np.asarray(src2), cv2.COLOR_RGB2BGR)

    cv2.imshow("CeShi",src2)

    cv2.waitKey(0)

    1785250-20200404175151373-1257377007.png

    图3.4.1检测结果图

    1785250-20200404175530298-923994625.png

    图3.4.2检测结果图

    1785250-20200404175554696-612215842.png

    图3.4.3检测结果图

    四、问题及解决方法

    (1)刚开始自己想的是将两张灰度图利用equals()函数进行比对看能否通过,结果不难想象确实太天真,这错误很低级了,数据类型都没分清楚的;

    (2)在网上查找资料一直找不到怎么直接对两张图像进行缺陷检测比对,只有一个差分检测;

    (3)有找到一个关于差异检测的相关资料可是发现其中一个SIF算法被申请了专利不能使用;

    (4)最后通过仔细研读了一个博主的代码,几次运行测试发现了轮廓数可以作为判断依据来实现我的目的,所以大胆采用了这一方法,成功实现了本次实验。

    五、实验总结

    本次实验让我感觉机器视觉实验越来越上升了难度,同时发现老师的高科技实验软件太厉害了,简单方便,科技的力量。本次实验花费了我足足一天的时间才勉强完成任务,之后应该还有一次更加困难的挑战,没有撤退可言唯有迎难而上。

    展开全文
  • 之前的人脸识别匹配需要大量图片进行建模,然后通过概率匹配,结果不是很准确,同时也不符合一般需求。一般需求是人员通过摄像头拍摄一张照片,然后将照片保存进行命名,之后如果再次通过摄像头进行验证时候,通过...

    之前的人脸识别匹配需要大量图片进行建模,然后通过概率匹配,结果不是很准确,同时也不符合一般需求。一般需求是人员通过摄像头拍摄一张照片,然后将照片保存进行命名,之后如果再次通过摄像头进行验证时候,通过算法特征匹配这个人跟保存的图片中的相似度,相似度最低的就是这个人,当然如果有足够的理论跟实验支持,可以确定最低的这个如果大于某个值,也认为不是这个人。

    LBP算法

    参考博客地址: http://blog.csdn.net/zouxy09/article/details/7929531

    http://blog.csdn.net/u010006643/article/details/46417091

    第二篇的最后结果是监测照片中是否是人脸,和人脸的各种表情匹配。但是我们的需求是要让摄像头里的人匹配上后台保存的那张单独的图片,所有改进一下让LBP算法只比较两张图片差异,差异最小的就是这个人,虽然最后误差仍然存在,但是算法是慢慢改进的,至少测试的过程我的识别结果都是我自己。

    下面说思路:

    一 。摄像头截图,截图成灰色处理的,并且尺寸为98*116的,(后面LBP算法是按照98*116的,方便分割),然后手动挑取一张最好的当作对比库放到指定路径下。****注意文件名不要中文

    说明:这个截取如果判定是人脸了,就进行截取图片,有时候不会识别出人脸,人稍微移动一下就可以,这个跟手机识别软件差不多,多数情况你要动态的才能更好识别。

    操作:运行shibieJietu.py

    1044716-20171226105604431-580689173.png

    1044716-20171226105636040-130598987.png

    importnumpy as npimportcv2importsysimporttimeimportosdefCatVideo():

    cv2.namedWindow("shibie")#1调用摄像头

    cap=cv2.VideoCapture(0)#2人脸识别器分类器

    classfier=cv2.CascadeClassifier("Train.xml")

    color=(0,255,0)whilecap.isOpened():

    ok,frame=cap.read()if notok:break

    #2灰度转换

    grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数

    faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))if len(faceRects) > 0: #大于0则检测到人脸

    for (x, y, w, h) infaceRects :

    listStr= [str(int(time.time())), str(0)] #以时间戳和读取的排序作为文件名称

    fileName = ''.join(listStr)

    f= cv2.resize(grey[y:(y + h), x:(x + w)], (98, 116))

    cv2.imwrite('D:\opencv\pictures\picTest'+os.sep+'%s.jpg' %fileName, f)

    cv2.rectangle(frame, (x- 10, y - 10), (x + w + 10, y + h + 10), color, 3)

    cv2.imshow("shibie",frame)print("ceshi2")if cv2.waitKey(10)&0xFF==ord('q'):breakcap.release()

    cv2.destroyAllWindows()

    CatVideo()

    1044716-20171226095948634-161989191.png

    二 。photoKu文件夹的六个文件夹,分别放上不同人,照片都是灰化处理的,尺寸98*116。灰化图片详情参考上一篇博客的pick_face.py。如果周围人多的话也可以让他通过摄像头进行步骤一取到图片,但  是我这实在没什么人帮忙,就用网上图片凑活了。

    运行compare.py首先执行runLBP算法,将六个文件夹里的图片通过算法算出LBP算子和统计直方图。

    三 。开启摄像头,识别人脸后将人脸进行judgeFace 方法与刚才的结果进行逐一匹配,找到方差最小的那个就是要匹配的那个人了。

    from numpy import *

    from numpy importlinalg as laimportcv2importosimportmathfrom read_data importread_name_list

    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

    #为了让LBP具有旋转不变性,将二进制串进行旋转。#假设一开始得到的LBP特征为10010000,那么将这个二进制特征,#按照顺时针方向旋转,可以转化为00001001的形式,这样得到的LBP值是最小的。#无论图像怎么旋转,对点提取的二进制特征的最小值是不变的,#用最小值作为提取的LBP特征,这样LBP就是旋转不变的了。

    defminBinary(pixel):

    length=len(pixel)

    zero= ''

    for i in range(length)[::-1]:if pixel[i] == '0':

    pixel=pixel[:i]

    zero+= '0'

    else:return zero +pixelif len(pixel) ==0:return '0'

    #加载图像

    def loadImageSet(add): #add是路径

    print("步骤1")

    FaceMat= mat(zeros((1,98*116)))#根据图片尺寸更改 一共有几行

    j =0for i inos.listdir(add):#print(i) #图片正常显示了

    #print(i.split('.')[1]) 输出结果:jpg

    if i.split('.')[1] == 'jpg':try:

    img= cv2.imread(add+i,0)#print(add+i) 输出结果:D:\opencv\huge/15138183801.jpg

    #cv2.imwrite(str(i)+'.jpg',img)

    except:print ('load %s failed'%i)

    FaceMat[j,:]=mat(img).flatten()#print(FaceMat[j,:]) #取第j行

    #print(FaceMat[:,j]) #取第j列

    #http://blog.csdn.net/qq_18433441/article/details/54916991 flatten详解

    j += 1

    #print(FaceMat)

    returnFaceMat#算法主过程

    def LBP(FaceMat,R = 2,P = 8):print("步骤2")

    Region8_x=[-1,0,1,1,1,0,-1,-1]

    Region8_y=[-1,-1,-1,0,1,1,1,0]

    pi=math.pi

    LBPoperator=mat(zeros(shape(FaceMat)))for i in range(shape(FaceMat)[1]):#对每一个图像进行处理 转化成116*98的二维矩阵

    face = FaceMat[:,i].reshape(116,98)

    W,H=shape(face)

    tempface=mat(zeros((W,H)))for x in range(R,W-R):for y in range(R,H-R):

    repixel= ''pixel=int(face[x,y]) #取每一个值

    #圆形LBP算子

    for p in [2,1,0,7,6,5,4,3]:

    p=float(p)

    xp= x + R* cos(2*pi*(p/P))

    yp= y - R* sin(2*pi*(p/P))#print(xp) 输出结果 2.0

    #print(pixel) 输出结果 1

    #print(yp) 0.0

    #print(face[2,0]) 1.0

    if int(face[int(xp),int(yp)])>pixel:

    repixel+= '1'

    else:

    repixel+= '0'

    #minBinary保持LBP算子旋转不变

    tempface[x,y] = int(minBinary(repixel),base=2)

    LBPoperator[:,i]=tempface.flatten().T#cv2.imwrite(str(i)+'hh.jpg',array(tempface,uint8))

    returnLBPoperator#judgeImg:未知判断图像

    #LBPoperator:实验图像的LBP算子

    #exHistograms:实验图像的直方图分布

    defjudgeFace(judgeImg,LBPoperator,exHistograms):

    judgeImg=judgeImg.T

    ImgLBPope=LBP(judgeImg)#把图片分为7*4份 , calHistogram返回的直方图矩阵有28个小矩阵内的直方图

    judgeHistogram =calHistogram(ImgLBPope)

    minIndex=0

    minVals= inf #正无穷

    for i in range(shape(LBPoperator)[1]):

    exHistogram=exHistograms[:,i]

    diff= (array(exHistogram-judgeHistogram)**2).sum()print(diff)returndiff#统计直方图

    defcalHistogram(ImgLBPope):

    Img= ImgLBPope.reshape(116,98)

    W,H=shape(Img)#把图片分为7*4份

    Histogram = mat(zeros((256,7*4)))

    maskx,masky= W/4,H/7 #29 14

    for i in range(4):for j in range(7):#使用掩膜opencv来获得子矩阵直方图

    mask =zeros(shape(Img), uint8)

    mask[int(i*maskx): int((i+1)*maskx),int(j*masky) :int((j+1)*masky)] = 255hist= cv2.calcHist([array(Img,uint8)],[0],mask,[ 256],[0,256])

    Histogram[:,(i+1)*(j+1)-1] =mat(hist).flatten().TreturnHistogram.flatten().TdefrunLBP(tuPianPath):#加载图像

    FaceMat = loadImageSet(tuPianPath).T #反转矩阵

    LBPoperator = LBP(FaceMat) #获得实验图像LBP算子

    #获得实验图像的直方图分布,这里计算是为了可以多次使用

    exHistograms = mat(zeros((256*4*7,shape(LBPoperator)[1])))for i in range(shape(LBPoperator)[1]):

    exHistogram=calHistogram(LBPoperator[:,i])

    exHistograms[:,i]=exHistogram

    allLBPoperator.append(LBPoperator)

    allexHistograms.append(exHistograms)#build_camera(LBPoperator,exHistograms)

    #loadname = 'D:\opencv/'+'8.jpg'

    #judgeImg = cv2.imread(loadname,0)

    #jresult=judgeFace(mat(judgeImg).flatten(),LBPoperator,exHistograms)

    #if judgeFace(mat(judgeImg).flatten(),LBPoperator,exHistograms)+1 == int(nameList[i]):

    defbuild_camera():print(1111)#opencv文件中人脸级联文件的位置,用于帮助识别图像或者视频流中的人脸

    face_cascade = cv2.CascadeClassifier('Train.xml')#打开摄像头并开始读取画面

    cameraCapture =cv2.VideoCapture(0)

    success, frame=cameraCapture.read()while success and cv2.waitKey(1) == -1:

    success, frame=cameraCapture.read()

    grey= cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #图像灰化

    faces = face_cascade.detectMultiScale(grey, 1.3, 5) #识别人脸

    for (x, y, w, h) infaces:

    f= cv2.resize(grey[y:(y + h), x:(x + w)], (98, 116))

    result=inf

    show_name=''

    for i inrange(len(allTuPianPath)):

    jresult=judgeFace(mat(f).flatten(),allLBPoperator[i],allexHistograms[i])if jresult==0:

    show_name=allmen[i]break

    elif jresult

    result=jresult

    show_name=allmen[i]#print(f)

    #if prob >0.5: #如果模型认为概率高于70%则显示为模型中已有的label

    #show_name = name_list[label]

    #else:

    #show_name = 'Stranger'

    cv2.putText(frame, show_name, (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2) #显示名字

    frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) #在人脸区域画一个正方形出来

    cv2.imshow("Camera", frame)returnshow_name

    cameraCapture.release()

    cv2.destroyAllWindows()if __name__ == '__main__':

    allLBPoperator=[]#六个LBP算子

    allexHistograms=[]#六个统计直方图

    #六个文件夹路径

    allTuPianPath=['D:\opencv\photoKu\huge/','D:\opencv\photoKu\luyi/','D:\opencv\photoKu\me/','D:\opencv\photoKu\shayi/','D:\opencv\photoKu\wuyanzu/','D:\opencv\photoKu\zhoujielun/']

    #六个人名

    allmen=['hege','luyi','me','shayi','wuyanzu','zhoujielun']

    #分别获取每张图片的LBP算子,和统计直方图for tuPianPath inallTuPianPath:

    runLBP(tuPianPath)

    #开启摄像头

    name=build_camera()

    #最后摄像头如果关闭会打印出这个人名print(name)

    1044716-20171226105708619-1679130480.png

    1044716-20171226105726275-799190920.png这张图片是输出的结果,开始分别算出六个LBP算子和统计立方图片,步骤一步骤二打印六次,然后1111进入摄像头,开始比较识别到的人脸,与六张图的平方差分别是

    245164,175674,50472,248620,162249,222144。 (第三张是我本人,平方差是5万多,明显比其他的低的多)

    ****这里需要注意的是,摄像头之前截取的头像,应该跟对比时候的头像差别不会太大,因为都只有一个头,环境都差不太多,至于化妆,戴帽子什么的应该会有差异,但是谁家早上视频识别时候不好好的,非得戴帽子,带镜子啥的,所以,只要尽量做到一致性,识别差距就不会太大。

    由于是while循环摄像头,所以识别到的下一张头像继续运算下去,这里其实可以将摄像头关掉了,然后打印出人名即可,有需要的可以自己改动。我懒。

    最后不得不承认,运算过程太卡顿,而且摄像头循环也没做退出处理,需要慢慢等着,然后六个平方差都算完后头像上显示人名,以后争取改进成多线程的,估计会快一些。现在是截取了一张图片然后就开始比对,这张图片此时不能再动了,导致摄像头发生卡顿,多线程应该能够解决这个问题。

    代码地址:https://github.com/chaoyuebeijita/face

    facecompare+LBP.zip

    展开全文
  • Android OpenCv进行图片比对

    千次阅读 2016-01-27 15:56:37
    OpenCv 对于图片有很多的处理方式,现在我想要实现俩张图片比对。 首先要知道做个需要那些步骤: (1)加载俩张图片 (2)将两张图片转换为Mat矩阵 (3)把Mat矩阵的type转换为Cv_8uc1类型,然后转换为Cv_32F, ...
  • 原文链接 图片对比 基于OpenCV和Python的 图像比对 - 热分享​hotdog29.com在 2019年7月27日 上张贴 由 hotdog发表回复图片对比 基于OpenCV和Python的 图像比对在之前的博客文章中,我详细介绍了如何使用结构相似性...
  • 今天小编就为大家分享一篇在python中利用opencv简单做图片比对的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • python版本为3.7.7,OpenCV版本为4.2.1,源码如下: # -*- coding: utf-8 -*- from skimage.metrics import structural_similarity import imutils import cv2 # 加载两张图片并将他们转换为灰度 imageA = cv2....
  • python中利用opencv简单做图片比对

    千次阅读 2017-12-21 17:30:37
    python环境中,利用opencv对二值单通道图片进行比对 下面代码中利用了两种比对的方法,一 对图片矩阵(m x m)求解特征值,通过比较特征值是否在一定的范围内,判断图片是否相同。二 对图片矩阵(m x m)中1求和,...
  • 方法描述:有两幅图像patch(当然也可是整幅图像),分别计算两幅图像的直方图,并将直方图进行归一化,然后按照某种距离度量的标准进行相似度的测量。 方法的思想:基于简单的向量相似度来对图像相似度进行度量。 ...
  • C++ 图片相似度比对opencv库)

    万次阅读 2016-11-17 13:31:18
    利用opencv 做简单的图片识别,或译图片相似度识别,过游戏验证
  • opencv+颜色直方图+相似图像比对

    千次阅读 2018-08-13 15:30:38
    这个是之前学习openCV时做过的,时间长了怕找不到,还是写下来的好。 首先,图像直方图是什么?...openCV中封装了计算直方图的函数calcHist(),调用这个函数可以很方便的计算图像的颜色直方图。...
  • c# OpenCV -1 直接比对两张图片

    千次阅读 2018-12-01 22:59:07
    输入两张图片,返回比对结果: DrawMatches.Test(arrICs[3], arrICs[1]); 本例基于EmguCv...    public static class DrawMatches  {  public static void FindMatch(Mat modelImage, Mat observedImage, out ...
  • #import "UIImage+OpenCV.h" #import "MyViewController.h" #import #import #import #import #import @interface MyViewController () - (void)processFrame; @end @implementation MyViewController @syn
  • opencv图像相似度对比

    2015-06-17 09:33:12
    opencv的关于两幅图像相似度对比的程序,具有很大的参考意义
  • 基于opencv2.4.8,vs2010环境,实现在一张图片中查找另外一张图片物体的功能。运行环境下测试通过。带控制进度条可调节hassian值,以调整搜寻的参数。附带珍贵测试照片。
  • opencv 图像分割

    2021-03-18 15:33:03
    1、图像阈值化 源代码: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; int thresholds=50; int model=2;...
  • OpenCV图像处理

    千次阅读 2015-11-05 11:42:32
    http://hahack.com/wiki/opencv-image.html
  • OpenCV图像特征匹配

    2021-10-09 10:48:24
    暴力匹配就是对两张图像的特征向量进行比对,最接近的也就是最相似的。我们可以通过欧式距离来实现向量相似的比对,默认使用归一化的欧氏距离。 这里依旧使用之前所讲的sift算法,代码如下: import cv2 import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,700
精华内容 1,080
关键字:

opencv图片比对