
由于高版本19.21的DlibDotNet也存在BitmapExtensions,与DlibDotNet.Extensions.BitmapExtensions存在冲突。因此本案例采用 19.18的DlibDotNet、DlibDotNet.Extensions。


需要将shape_predictor_5_face_landmarks.dat或者shape_predictor_68_face_landmarks.dat放在程序face_data目录下。
using OpenCvSharp;
using OpenCvSharp.Extensions;
using DlibDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace app
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
/// <summary>
/// 进行人脸识别
/// </summary>
/// <param name="image">图像</param>
/// <param name="numOfFaceDetected"> 识别到的人脸数目</param>
/// <returns></returns>
public Bitmap FaceDetectionFromImage(Bitmap image, out int numOfFaceDetected)
{
// 人脸数据文件路径名称属性
// 默认文件路径
string faceDataPath = @"face_data\shape_predictor_68_face_landmarks.dat";
numOfFaceDetected = 0;
if (image != null)
{
// 图像转换到Dlib的图像类中
Array2D<RgbPixel> img = DlibDotNet.Extensions.BitmapExtensions.ToArray2D<RgbPixel>(image);
using (var faceDetector = Dlib.GetFrontalFaceDetector())
using (var shapePredictor = ShapePredictor.Deserialize(faceDataPath))
{
// 检测人脸
var faces = faceDetector.Operator(img);
// 遍历检测到的人脸区域
foreach (var rect in faces)
{
// 绘制脸部区域
Dlib.DrawRectangle(img, rect, new RgbPixel { Red = 255 }, 3);
/*
// 人脸区域中识别脸部特征
var shape = shapePredictor.Detect(img, rect);
// 简单绘制识别到的特征(用线连起来)
for (uint i = 1; i < shape.Parts; i++)
{
Dlib.DrawLine(img, shape.GetPart(i), shape.GetPart(i - 1), new RgbPixel { Red = 255 });
}
*/
}
numOfFaceDetected = faces.Length;
}
return DlibDotNet.Extensions.BitmapExtensions.ToBitmap<RgbPixel>(img);
}
return image;
}
/// <summary>
/// 打开摄像头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenVideo_Click(object sender, EventArgs e)
{
// 定义图像捕捉方式 从摄像头 , 注意 Windows下需要选择 VideoCaptureAPIs.DSHOW
var capture = new VideoCapture(0, VideoCaptureAPIs.DSHOW);
if (!capture.IsOpened())
return;
capture.XI_OffsetX = 0; // 以左上角为起点 坐标X
capture.XI_OffsetY = 0; // 以左上角为起点 坐标Y
capture.FrameWidth = 640; // 宽
capture.FrameHeight = 480; // 高
capture.AutoFocus = true;
const int sleepTime = 10;
//var window = new Window("cv");
// Mat作为图像的存储容器
var image = new Mat();
while (true)
{
capture.Read(image);
if (image.Empty())
break;
// 显示
//window.ShowImage(image);
// Windows窗体PictureBox加载
//picboxDest.Image = image.ToBitmap();
int numFaces = 0;
//Bitmap img = image.ToBitmap();
picboxDest.Image = FaceDetectionFromImage(image.ToBitmap(), out numFaces);
/*
int flag = Cv2.WaitKey(sleepTime);
if (flag >= 0)
{
break;
}
*/
// 可以防止界面停止响应
Application.DoEvents();
}
}
}
}
你好,最近一直在看您写的博客,受益匪浅。现在我有个需求,是在图片中识别印章,印章可能是圆形、正方形、长方形、三角形,我的思路是识别红色区域,再识别红色区域内的字,请问您有什么好的建议吗
第一种思路:
1、先分离红色区域。
2、分割处理红色区域里面的文字。
3、文字匹配、识别。
如果从零开始写,识别的准确率还是偏低的。可以找一些成熟的ocr识别库,减少调试的工作量。
第二种思路:
1、如果印章是固定内容的。可以用模板匹配的思路。
第三种思路:
1、训练模型。通过模型来识别印章。
你好,有用过OpenCvSharp Dlib人脸检测 + 人脸识别吗?
您好。api更新的比较快。具体还是要查看文档。
命名空间“DlibDotNet.Extensions”中不存在类型或命名空间名“BitmapExtensions”(是否缺少程序集引用?)
用 你说的版本 也不行哦 ,不知道什么问题
您好。具体还是要看下开发环境的版本库,检查下是否存在冲突。