2019-01-31 09:40:10 weixin_42137700 阅读数 1305
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4133 人正在学习 去看看 贾志刚

https://www.toutiao.com/a6651763844760732164/

 

2019-01-29 12:00:57

识别算法

一般来说,人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别(身份确认或者身份查找)。系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸识别。

人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。

人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别

 

人脸识别算法分类

基于人脸特征点的识别算法(Feature-based recognition algorithms)。

基于整幅人脸图像的识别算法(Appearance-based recognition algorithms)。

基于模板的识别算法(Template-based recognition algorithms)。

利用神经网络进行识别的算法(Recognition algorithms using neural network)。

人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别

 

基于光照估计模型理论

提出了基于Gamma灰度矫正的光照预处理方法,并且在光照估计模型的基础上,进行相应的光照补偿和光照平衡策略。

优化的形变统计校正理论

基于统计形变的校正理论,优化人脸姿态;神经网络识别

强化迭代理论

强化迭代理论是对DLFA人脸检测算法的有效扩展;

独创的实时特征识别理论

该理论侧重于人脸实时数据的中间值处理,从而可以在识别速率和识别效能之间,达到最佳的匹配效果

人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别

 

识别数据

人脸识别需要积累采集到的大量人脸图像相关的数据,用来验证算法,不断提高识别准确性,这些数据诸如A Neural Network Face Recognition Assignment(神经网络人脸识别数据)、orl人脸数据库、麻省理工学院生物和计算学习中心人脸识别数据库、埃塞克斯大学计算机与电子工程学院人脸识别数据等。

2019-08-29 22:01:35 a18612039484 阅读数 99
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4133 人正在学习 去看看 贾志刚

OpenCV基础

opencv是一个计算机视觉库,用于图像处理。

常规图像处理

API:

import numpy as np
import cv2 as cv

# 读取图片
original = cv.imread('')

# 显示图片
cv.imshow('title',original)
cv.waitkey() # 不wait直接闪退,waitkey靠点击退出

# 剪裁图片
h,w = original.shape[:2]
l,t = int(w/4),int(h/4)
r,b = int(w*3/4),int(h*3/4)
cropped = original[t:b,l:r]

# 图像缩放
scaled = cv.resize(original,(int(w/4),int(h/4)),
    interpolation = cv.INTER_LINEAR)

# 图像保存
cv.imwrite('path/name',img)

边缘检测

思想:通过识别亮度梯度变化最大的像素点从而检测出物体的边缘
API:

import cv2 as cv
original = cv.imread('',cv.IMREAD_GRAYSCALE)
# 索贝尔边缘识别
s_img = cv.Sobel(origianl,cv.CV_64F,1,0,ksize = 5)
cv.imshow('sobel',s_img)
# 拉普拉斯边缘识别
l_img = cv.Laplacian(original,cv.CV_64F)
cv.imshow('Laplacian',l_img)
# 卡尼边缘识别
c_img = cv.Canny(original,50,240)
cv.imshow('canny',c_img)

cv.waitkey()

亮度提升

直方图均衡化实现亮度提升,更有利于边缘识别

import cv2 as cv
original = cv.imread('')
# 彩色图转为灰度图
gray = cv.cvtColor(original,cv.COLOR_BGR2GRAY)
# 直方图均衡化
equalized_gray = cv.equalizeHist(gray)
cv.imshow('Equalized Gray',equalized_gray)

# 提升亮度
yuv = cv.cvtColot(original,cv.COLOR_BGR2YUV)
yuv[...,0] = cv.equalizeHist(yuv[...,0])
equalize_color = cv.cvtColor(yuv,cv.COLOR_YUV2BGR)
cv.imshow('Equalized Color',equalized_color)
cv.waitKey()

角点检测

角点:平直棱线的交汇点
API:

# 灰度化原图
gray = cv.cvtColor(original,cv.COLOR_BGR2GRAY)
# Harris 角点检测器
# 边缘水平方向、垂直方向颜色值改变超过阈值7、5时即为边缘
# 边缘线方向改变超过阈值0.04弧度即为一个角点。
corners = cv.cornerHarris(gray,7,5,0.04)

# 绘制角点
mixture = original.copy()
mixture[corners>corners.max()*0.01]=[0,0,255]
cv.imshow('Corner',mixture)
cv.waitKey()

图像识别

特征点检测

常用的特征点检测方法:STAR检测和SIFT检测
特征点检测结合了边缘检测和角点检测

STAR特征点检测

API:

import cv2 as cv
original = cv.imread('')
gray = cv.cvtColor(original,cv.COLOR_BGR_2GRAY)

# 创建star特征点检测器
star = cv.xfeatures2d.StarDetector_create()
# 检测出gray图像所有的特征点
keypoints = star.detect(gray)
mixture = origianl.copy()
cv.drawKeypoints(
    original,keypoints,mixture,
    flags = cv.DRAN_MATCHES_FLAGS_DRAN_RICH_KEYPOINTS
)
cv.imshow('Mixture',mixture)
cv.waitKey()

SIFT特征点监测

API:

import cv2 as cv
original = cv.imread('')
gray = cv.cvtColor(original,cv.COLOR_BGR_2GRAY)

# 创建sift特征点检测器
star = cv.xfeatures2d.SIFT_create()
# 检测出gray图像所有的特征点
keypoints = star.detect(gray)
mixture = origianl.copy()
cv.drawKeypoints(
    original,keypoints,mixture,
    flags = cv.DRAN_MATCHES_FLAGS_DRAN_RICH_KEYPOINTS
)
cv.imshow('Mixture',mixture)
cv.waitKey()

特征值矩阵

特征值矩阵记录图像的每个特征点的梯度信息,提取特征值矩阵,只要有足够多的的样本,就可以做隐马尔可夫模型。类似于mfcc(梅尔频率倒谱系数–语音识别)
API:

import cv2 as cv
original = cv.imread('')
gray = cv.cvtColor(original,cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()
keypoints = sift.detect(gray)
# 创建特征值矩阵desc
_,desc = sift.compute(gray,keypoints)

物体识别案例

API:

import numpy as np
import cv2 as cv
import hmmlearn.hmm as hl

def search_files(directory):
    #详见CSDN ghcjasongo 工具三
    pass

# 获取训练集
train_objects = search_files('')
train_x,train_y = [],[]
for label,filenames in train_objects.items():
    descs = np.array[]
    for filename in filenames:
        image = cv.imread(filename)
        gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
        # 范围缩放,使特征描述矩阵样本数量一致
        h,w = gray.shape[:2]
        f = 200/min(h,w)
        gray = cv.resize(gray,None,fx=f,fy=y)

        # 提取sift特征值点
        sift = cv.xfeatures2d.SIFT_create()
        keypoints = sift.detect(gray)
        _,desc = sift.compute(gray,keypoints)
        if len(descs) == 0:
            descs == desc
        else:
            descs = np.append(descs,desc,axis = 0)
    train_x.append(descs)
    train_y.appedn(label)

# 训练隐马尔可夫模型
models = {}
for descs,label in zip(train_x,train_y):
    model = hl.GaussianHMM(
        n_components = 4,covariance_type = 'diag',n_iter = 100
    )
    model[label] = model.fit(descs)


# 测试集数据整理同训练集
# 测试数据
pred_y = []
for descs in test_x:  # 遍历3次
    # 验证每个模型对当前desc的匹配度得分
    best_score, best_label = None, None
    for label, model in models.items():
        score = model.score(descs)
        if (best_score is None) or (best_score < score):
            best_score = score
            best_label = label
    pred_y.append(best_label)

print(test_y)
print(pred_y)

人脸识别

视频捕捉

API:


import cv2 as cv
# 获取视频捕捉设备
video_capture = cv.VideoCapture(0)
while True# 读取一帧
    frame = video_capture.read()[1]
    cv.imshow('VideoCapture',frame)
    if cv.waitKey(33) == 27:
        break
video_capture.release()
cv.destroyAllWindows()

人脸定位

哈尔级联人脸定位
API:

import cv2 as cv
# 哈尔级联人脸定位
face_d = cv.CascadeClassifier('haar/face.xml')
eye_d = cv.CascadeClassifier('haar/eye.xml')
nose_d = cv.CascadeClassifier('haar/nose.xml')
# 创建人脸捕捉器
vc = cv.VideoCapture(0)
while True:
    frame = vc.read[1]
    # 1.3为最小人脸尺寸,最多抓5张脸
    faces = face_d.detectMultiScale(frame,1.3,5)
    for l,t,w,h in faces:
        a,b = int(w/2),int(h/2)
        cv.ellipse(frame,(l+a,t+b),(a,b),0,0,360,(255,0,255),2)
        # 绘制椭圆
        #cv.ellipse(
        #face, # 图像
        #(l + a, t + b), # 椭圆心
        #(a, b), # 半径
        #0, # 椭圆旋转角度
        #0, 360, # 起始角, 终止角
        #(255, 0, 255), # 颜色
        #2 # 线宽
        #)
        face = frame[t:t+h,l:l+w]
        eyes = eye_d.detectMultiScale(face,1.3,5)
        for l,t,w,h in eyes:
            a,b = a,b = int(w/2),int(h/2)
            cv.ellipse(face,(l+a,t+b),(a,b),0,0,360,(255,0,255),2)
        noses = nose_d.detectMultiScale(face,1.3,5)
        for l,t,w,h in noses:
            a,b = a,b = int(w/2),int(h/2)
            cv.ellipse(face,(l+a,t+b),(a,b),0,0,360,(255,0,255),2)
    cv.imshow('VideoCapture',frame)
    if cv.waitKey(33) == 27:
        break
vc.release()
cv.destroyAllWindows()

人脸识别

opencv下的lbph(局部二值模式直方图)

import os
import numpy as np
import cv2 as cv
import sklearn.preprocessing as sp

# 创建哈尔级联人脸定位器
fd = cv.CascadeClassifier('haar/face.xml')
# 详见工具三
def search_faces(directory):
    pass

train_faces = search_faces(
    'faces/training')
# 创建标签编码器
codec = sp.LabelEncoder()
codec.fit(list(train_faces.keys()))
train_x, train_y = [], []
for label, filenames in train_faces.items():
    for filename in filenames:
        image = cv.imread(filename)
        # 对人脸进行灰度处理
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        # 创建人脸识别
        faces = fd.detectMultiScale(gray, 1.1, 2,
                                    minSize=(100, 100))
        for l, t, w, h in faces:
            train_x.append(
                gray[t:t + h, l:l + w])
            train_y.append(
                codec.transform([label])[0])
train_y = np.array(train_y)

# !!!!!!!!!!!!!!!!!!
# 局部二值模式直方图人脸识别分类器
model = cv.face.LBPHFaceRecognizer_create()
# 训练模型
model.train(train_x, train_y)

# 整理测试集数据
test_faces = search_faces(
    'faces/testing')
test_x, test_y, test_z = [], [], []
for label, filenames in test_faces.items():
    for filename in filenames:
        image = cv.imread(filename)
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        faces = fd.detectMultiScale(gray, 1.1, 2,
                                    minSize=(100, 100))
        for l, t, w, h in faces:
            test_x.append(
                gray[t:t + h, l:l + w])
            test_y.append(
                codec.transform([label])[0])
            a, b = int(w / 2), int(h / 2)
            # 绘制椭圆
            cv.ellipse(image, (l + a, t + b),
                       (a, b), 0, 0, 360,
                       (255, 0, 255), 2)
            test_z.append(image)
test_y = np.array(test_y)

# 预测
pred_test_y = []
for face in test_x:
    pred_code = model.predict(face)[0]
    pred_test_y.append(pred_code)

escape = False
while not escape:
    for code, pred_code, image in zip(
            test_y, pred_test_y, test_z):
        label, pred_label = \
            codec.inverse_transform([code, pred_code])
        text = '{} {} {}'.format(
            label,
            '==' if code == pred_code else '!=',
            pred_label)
        # 将文本写在图片上
        cv.putText(image, text, (10, 60),
                   cv.FONT_HERSHEY_SIMPLEX, 2,
                   (255, 255, 255), 6)
        cv.imshow('Recognizing...', image)
        if cv.waitKey(1000) == 27:
            escape = True
            break
2017-05-02 17:13:44 fengxianghui01 阅读数 6131
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4133 人正在学习 去看看 贾志刚

网上很多帖子、博客在谈人脸识别、人脸检测,其实很多都弄混了,现在来纠正一下。(观点只代表作者本人)

人脸识别是对已知人脸进行分类的过程。就像我们看到其他人一样能够分辨出谁是自己的朋友谁不是。人脸识别通常包括以下四个步骤:

1)人脸检测:是在图像中定位人脸区域的过程。(也就是关心是不是人脸,至于关心是谁不是这个步骤的任务)

2)人脸预处理:调整人脸图像,使其看起来更加清楚。

3)搜集和学习人脸:搜集许多被预处理过的人脸(这些人脸是要被识别的人的脸,而不是其他人的),人后学习如何识别他们。

4)人脸识别:在搜集的人脸中查找哪个人脸与摄像机中的人脸最相似。

后面的文章将会给出这几步的具体详解。

2017-07-31 17:24:01 search7 阅读数 831
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4133 人正在学习 去看看 贾志刚


人脸定位理论方法,参考冯伟兴的Visual C++ 数字图像模式识别典型案例详解

整个程序用python 写成。因为初涉python和opencv ,不足之处,请看客多多提出,共同交流。

人脸定位建立在肤色相似度检测的基础上,将检测后的图片,进行二值化处理,阈值设置为整幅图片的灰度均值,高于均值的设为255,相反则设为0.

人脸定位的关键在于找出人脸轮廓的边界。因为二值化后的人脸图片为白,因此利用水平和竖直投影计数的方法,阈值设为每行和每列的投影计数最大值的50%。这个阈值根据识别的人脸不同,需要有灵活的调整。

左右上用投影计数,为避免下部脖子影响定位,以1.2乘以脸宽,作为脸长。

用opencv的cv2.line(img1,(left,0),(left,h),(0,255,0),2) 和 cv2.rectangle(img2,(img_left,img_top),(img_right,img_bottom),(0,200,200),1,1,0) 函数确定边界,并实现矩形轮廓定位。


# -*- coding: utf-8 -*-
# the location and split

import cv2
import numpy as np

img = cv2.imread("image/grayface.jpg")
img2 = cv2.imread("image/t4.jpg")
h = img.shape[0]      #图像高宽
w = img.shape[1]
print(h)
print(w)


sum = 0         
midle = 0
print(img[34,67])
for i in range(h):
    for j in range(w):
        sum += img[i,j][1]   


midle = sum/(h*w)     #图像的灰度均值
print(midle)



for i in range(h):      #二值化
    for j in range(w):
        if img[i,j][1] > midle:
            img[i,j] = 255
        else:
            img[i,j] = 0

cv2.imshow('split',img)                
cv2.imwrite('image/split.jpg',img)


lwrite = np.zeros(h,np.int)
hwrite = lwrite
max = 0
print(img[34,67])
print(lwrite[34])
for j in range(w):      #统计每列中白色像素点个数
    for i in range(h):
        if img[i,j][1] == 255:
            lwrite[j] +=1
    if lwrite[j] > max:
        max = lwrite[j]
print(max)
img1 = img.copy()
#画出脸左侧轮廓线
for left in range(w):
    if lwrite[left + 1] > max/2:
        #cv2.line(img1,(left,0),(left,h),(0,255,0),2)
        img_left = left
        break

#画出脸右侧轮廓线    
for right in range(w-1,0,-1):
    if lwrite[right - 1] > max/2:
        #cv2.line(img1,(right,0),(right,h),(0,255,0),2)
        img_right = right
        break

ww = img_right - img_left
print(ww)

for i in range(h):      #统计每行中白色像素点个数
    for j in range(w):
        if img[i,j][1] == 255:
            hwrite[i] +=1
    if lwrite[i] > max:
        max = hwrite[i]
        

#画出脸上侧轮廓线
for top in range(h):
    if hwrite[top + 1] > max/3:
       # cv2.line(img1,(0,top),(w,top),(0,255,0),2)
        img_top = top
        break
    
#画出脸下侧轮廓
img_bottom = int(1.3*ww + img_top)
print(img_bottom)
#cv2.line(img1,(0,img_bottom),(w,img_bottom),(0,255,0),2)

#在二值化图上画出脸轮廓
cv2.rectangle(img1,(img_left,img_top),(img_right,img_bottom),(0,0,255),1,1,0)

cv2.imshow('img1',img1)
cv2.imwrite('image/location1.jpg',img1)

#在原图上画出脸轮廓

cv2.rectangle(img2,(img_left,img_top),(img_right,img_bottom),(0,200,200),1,1,0)
cv2.imwrite('image/location2.jpg',img2)

    





定位结果:






为什么每阶段选择的是颖宝不同的照片?

因为保存了很多颖宝的图片作为实验用,虽然不是粉丝,但是做实验用看着不会心烦,比较可爱。用此图片,不用上一张,是因为上一张的定位效果并不能很好用在此图片上。导致脸圈的太长。

别的颖宝的脸在定位的时候,甚至与出现定位到饰品上,因为裸露胳膊、以及木色背景,导致整张图片定位到整幅图片,出现定位失败。


2010-08-21 23:56:00 carson2005 阅读数 17704
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4133 人正在学习 去看看 贾志刚

最近几年,在国内掀起了一股图像处理、分析、识别的热潮,而其中的车牌识别和人脸识别无疑是其中的研究热潮。

本人没有做过车牌识别的项目,不便叙述,不过,倒是可以跟大家聊聊最近几年国内在人脸识别领域的一些发展情况。

广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括图像采集,人脸定位,预处理,人脸特征提取,模式分类、判决识别等等。当然,还包括相应的摄像机,摄像头等光学设备,以及PC,DSP,ARM等计算平台。毋庸置疑的是,在这当中,基于图像的智能分析(包括人脸定位,预处理,特征提取,模式分类,判决识别扥)是最重要的一个环节。而这个部分,属于模式识别、人工智能、机器学习相结合的一个产物。但就知识面来说,需要对概率论,数理统计,模式识别,模式分类,图像处理,线性代数,随机过程,高等数学等等这些课程有一定的熟悉程度。当然了,如果,你是在学校里面搞科研,matlab是肯定要熟练才行。如果,你是在公司里面搞图像算法方面,编程(一般采用c++)肯定是少不了的。当然,如果你不是专门搞图像算法这部分的,大概了解了解就可以了,如果仅仅是想利用业余兴趣来学习,个人感觉,会非常困难。 人脸识别,是20世纪80年代提出的,不过,国内真正开始做这部分,是20世纪90年代。个人认为,国内最早研究人脸识别的,当属于中科院计算所跟哈工大的一个联合面像实验室。该实验室的高文教授,陈熙林教授,山世光教授,直到今天,都一直活跃在人脸识别领域,更可贵的是,在IEEE上面发表了很多paper。这一点,很值得国内的同行学习。后来,该实验室,成为上海银晨的研发中心,专门为上海银晨做技术研发和技术支持。其次是中科院生物识别研究所的李子青教授,以及下属的中科奥森公司。李子青教授,当年在微软亚洲研究院的时候,就从事人脸识别方面的研究工作。后来,在中科院组建了专门的人脸识别研究团队(当然是他跟他带领的一群博士硕士)。该研究团队,首先提出了基于近红外的人脸识别技术,并将该项人脸识别技术用于08年北京奥运会。同时,基于近红外的人脸识别技术,得到了国际上同行业专家的认同和一致肯定。顺便提一下,李子青教授编辑了一本名为《Handbook of face recognition》的书籍,可以说是目前人脸识别领域,最为全面的一本参考书。接着,是清华大学的丁晓青教授。丁晓青教授在OCR(字符识别)领域,可谓国内第一人。不过,最近几年转行做人脸识别,也是非常有成就的。不说别的,就只从FRVT2006(美国国家标准研究所2006年全球人脸识别供应商系统性能测试)的测试结果来看,丁晓青教授的研究团队(自然也是丁教授跟她的博士、硕士)是唯一一个完成大规模3D人脸识别性能测试的参赛团队。由此可见,在国内人脸识别领域来说,她们的算法,在3D领域,绝对排名第一。不过,国内人脸识别产品市场占有率最高的,是汉王科技的门禁和考勤系统。汉王科技也是中科院下属的一个公司,其人脸识别技术,是采用双摄像头,分别捕获到人脸的信息,从而合成3D人脸图片,然后进行特征提取和相应的识别工作。最后一个,就是深圳的飞瑞斯,该公司最近也在推广其自主开发的人脸识别系统。于前几位不同的是,它们采用了多光源进行补光的策略,从而有效解决了人脸识别中环境干扰的问题。当然,除此之外,也有一些小公司或者单位,也在从事人脸识别方面的研究工作。不过,都没有自主的技术或者产品推出。在这里,就不介绍了。 注意:以上均为本人观点,仅供参考。

没有更多推荐了,返回首页