人脸识别demo分析(opencv版本)

2023-11-15

一、faceRecognition接口说明

/*******************************************************************
** 函数名:     faceRecognition
** 函数描述:   人脸识别
** 参数:       [int] recognitionPic: 识别的照片,[int] targetFaceIndex: 目标匹配照片索引值
** 返回:       失败返回-1,成功返回0
** 注意:
********************************************************************/
int faceRecognition(char *recognitionPic, int targetFaceIndex)
{
	Mat srcImg, targetImg, compImage;
	IplImage* faceImage;
	int predict = 0;
	char cmd[100] = {0};

	/* 加载人脸检测器 */
	CascadeClassifier cascade;
	if(!cascade.load(cascadeName))
	{
		printf("[cwr] load CascadeClassifier fail\n");
		return -1; 
	}
	//model = createEigenFaceRecognizer(0, SIMILAR_VALUE);
	model = createEigenFaceRecognizer();
	if (0 != access(TRAIN_XML, F_OK)) {
		trainPicture();
	}
	model->load(TRAIN_XML);
	srcImg = imread(recognitionPic);
	faceImage = detectFace(srcImg, cascade);
	if (faceImage == NULL) return -1;
	Mat cutImage(faceImage, 1);
	resize(cutImage, compImage, Size(DEFAULT_CUT_SIZE_W, DEFAULT_CUT_SIZE_H), ZOOM_SCALE, ZOOM_SCALE);//对人脸进行缩放,并且设置成特定分辨率
	imwrite(savePicture, compImage);
	/* 开始人脸比对 */
#if 0
	imshow("compare", compImage);
	waitKey(0);
#endif
	int predictLabel = -1;
	double predictConfidence = 0.0;
	model->predict(compImage, predictLabel, predictConfidence);
	printf("[cwr] predictLabel = %d\n", predictLabel);
	printf("[cwr] predictConfidence = ");
	cout<<predictConfidence<<endl;
		
	//predict = model->predict(compImage);
	//printf("[cwr] faceRecognition return predict: %d\n", predict);
#if 1
	if (predictLabel == targetFaceIndex && predictConfidence <= SIMILAR_VALUE) {
		printf("[cwr] Face recognition successful\n");
		s_faceRecognitionSuc++;
	} else {
		printf("[cwr] Face recognition fail\n");
		s_faceRecognitionFail++;
	}
#endif
	printf("[cwr] Face recognition success total cnt = %d, Face recognition fail total cnt = %d, Detect face fail total cnt = %d\n", s_faceRecognitionSuc, s_faceRecognitionFail, s_delectFaceFail);
    return 0;
}
1.1 Mat
(1)什么是Mat

矩阵的英文释义matrix,因此延伸出Mat这个缩写,Mat类简单理解为存放图片数据的容器。
在计算机内存中,数字图像以矩阵的形式存储和运算,比如,在MatLab中,图像读取之后对应一个矩阵,在OpenCV中,同样也是如此。数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵。
【照片是以矩阵的方式存储】

灰度图像的像素数据就是一个矩阵,矩阵的行对应图像的高(单位为像素),矩阵的列对应图像的宽(单位为像素),矩阵的元素对应图像的像素,矩阵元素的值就是像素的灰度值。
灰度图像就是黑白照片,所以opencv操作图像都需要先转化为灰度照片来提高速度。
灰度值,我自己的理解应该就是黑白之前的差异,亮或者暗,这两者关系。

图像灰度值 灰度值与像素值的关系 - bingqingsuimeng的专栏 - CSDN博客 https://blog.csdn.net/bingqingsuimeng/article/details/64440699

Mat类的组成,由两部分数据组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。

1.2 IplImage

在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构;
在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写的,提供的接口也是C语言接口
Mat是后来OpenCV封装的一个C++类,用来表示一个图像,和IplImage表示基本一致,但是Mat还添加了一些图像函数;

IplImage转Mat

IplImage* faceImage;
Mat cutImage(faceImage, 1);

1.3 opencv常用图像处理函数
(1)resize函数说明

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );

参数说明:

src:输入,原图像,即待改变大小的图像;
dst:输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
dsize:输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么原图像缩放之后的大小就要通过下面的公式来计算:
dsize = Size(round(fx*src.cols), round(fy*src.rows)) cols列 rows行
其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。
fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;
interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:

INTER_NEAREST - 最邻近插值
INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
INTER_CUBIC - 4x4像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

【感觉最后一个参数都不用设置】

resize(img, dst, Size(300, 200), 0.3, 0.3);//将原图比例缩放0.3 并且分辨率设置为300 200

缩放就是按照原图的分辨率进行缩放。如果Size已经设置分辨率了,就没必要设置缩放比例了。优先会设置分辨率。
但是如果是打算图片按比例缩小,最简单的方法就是调整比例。resize(img, dst, Size(), 0.3, 0.3) Size()直接内部参数为空就好。
保存指定的分辨率直接resize(img, dst, Size(300, 200), 1, 1) 在Size()内部设置自己想要的参数即可。

使用注意事项

  1. dsize和fx/fy不能同时为0,要么你就指定好dsize的值,让fx和fy空置直接使用默认值,就像
    resize(img, imgDst, Size(30,30));
    要么你就让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍!
  2. 至于最后的插值方法,正常情况下使用默认的双线性插值就够用了。
    几种常用方法的效率是:最邻近插值>双线性插值>双立方插值>Lanczos插值;
    但是效率和效果成反比,所以根据自己的情况酌情使用。
  3. 正常情况下,在使用之前dst图像的大小和类型都是不知道的,类型从src图像继承而来,大小也是从原图像根据参数计算出来。但是如果你事先已经指定好dst图像的大小,那么你可以通过下面这种方式来调用函数:
    resize(src, dst, dst.size(), 0, 0, interpolation);

OpenCV图像中的x,y;width,height;cols,rows
x:横坐标
y:纵坐标
width:宽度
height:高度
cols:代表有多少列,其实就是x
rows:代表有多少行,其实就是y

(2)imwrite

1、filename:需要写入的文件名,会自己创建(像imwrite(“1.jpeg”,src);这样)
2、img:要保存的图像
3、params:表示为特定格式保存的参数编码
注意:你要保存图片为哪种格式,就带什么后缀。

(3)imshow

Displays an image in the specified window. 在特定的窗口上显示图像。
C++: void imshow(const string& winname, InputArray image)
Parameters:
winname – Name of the window. 窗口名称。
image – Image to be shown. 要显示的图像。

(4)imread

API详解:
原型:Mat imread(const string& filename, int flags = 1) ;
参数1:需要载入图片的路径名,例如“C:/daima practice/opencv/mat3/mat3/image4.jpg”
参数2:加载图像的颜色类型。默认为1. 若为0则灰度返回,若为1则原图返回。

flags = -1:imread按解码得到的方式读入图像
flags = 0:imread按单通道的方式读入图像,即灰白图像
flags = 1:imread按三通道方式读入图像,即彩色图像

(5) waitKey

waitKey(x);
第一个参数: 等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的
ASCII码,否则返回-1
如果x=0,那么无限等待下去,直到有按键按下
另外,在imshow之后如果没有waitKey语句则不会正常显示图像。

1.4 人脸检测

(1)CascadeClassifier
这个叫级联分类器。用于opencv人脸检测。
cascade.load(cascadeName) 对级联分类器进行初始化。

只需要初始化CascadeClassifier级联分类器,通过加载xml文件(人脸检测器),级联分类器可以根据xml来支持不同的识别效果。

有识别眼睛、身体等。

常用的一些成员说明,具体可以查看源码/opencv-2.4.10/modules/objdetect/doc/cascade_classification.rst

定义以及函数解释都在源码中注明了

class CV_EXPORTS_W CascadeClassifier
{
public:
    CV_WRAP CascadeClassifier();
     //从文件中加载级联分类器
    CV_WRAP CascadeClassifier(const String& filename);
    ~CascadeClassifier();
    //检测级联分类器是否被加载
    CV_WRAP bool empty() const;
    //从文件中加载级联分类器
    CV_WRAP bool load( const String& filename );
    //从FileStorage节点读取分类器
    CV_WRAP bool read( const FileNode& node );

    /** 检测输入图像中不同大小的对象。检测到的对象以矩形列表的形式返回。
    参数:
    image: 包含检测对象的图像的CV_8U类型矩阵
    objects: 矩形的向量,其中每个矩形包含被检测的对象,矩形可以部分位于原始图像之外
    scaleFactor: 指定在每个图像缩放时的缩放比例
    minNeighbors:指定每个候选矩形需要保留多少个相邻矩形
    flags:含义与函数cvHaarDetectObjects中的旧级联相同。它不用于新的级联
    minSize:对象最小大小,小于该值的对象被忽略。
    maxSize:最大可能的对象大小,大于这个值的对象被忽略

    该函数与TBB库并行
    */
    CV_WRAP void detectMultiScale( InputArray image,
                          CV_OUT std::vector<Rect>& objects,
                          double scaleFactor = 1.1,
                          int minNeighbors = 3, int flags = 0,
                          Size minSize = Size(),
                          Size maxSize = Size() );

    /** 
    detectMultiScale重载函数
    参数:
    image:包含检测对象的图像的CV_8U类型矩阵
    objects: 矩形的向量,其中每个矩形包含被检测的对象,矩形可以部分位于原始图像之外
    numDetections: 对应对象的检测编号向量。一个物体被探测到的次数是相邻的被积极分类的矩形的数量,这些矩形被连接在一起形成物体
    scaleFactor: 指定在每个图像缩放时的缩放比例
    minNeighbors:指定每个候选矩形需要保留多少个相邻矩形
    flags:含义与函数cvHaarDetectObjects中的旧级联相同。它不用于新的级联
    minSize:对象最小大小,小于该值的对象被忽略。
    maxSize:最大可能的对象大小,大于这个值的对象被忽略 
    */
    CV_WRAP_AS(detectMultiScale2) void detectMultiScale( InputArray image,
                          CV_OUT std::vector<Rect>& objects,
                          CV_OUT std::vector<int>& numDetections,
                          double scaleFactor=1.1,
                          int minNeighbors=3, int flags=0,
                          Size minSize=Size(),
                          Size maxSize=Size() );

    /**
    detectMultiScale重载函数,此函数允许您检索分类的最终阶段决策确定性
    为此,需要将' outputRejectLevels '设置为true,并提供' rejectLevels '和' levelWeights '参数。
对于每一个结果检测,‘levelWeights’将在最后阶段包含分类的确定性。

这个值可以用来区分强分类和弱分类。

    具体使用示例代码
    Mat img;
    vector<double> weights;
    vector<int> levels;
    vector<Rect> detections;
    CascadeClassifier model("/path/to/your/model.xml");
    model.detectMultiScale(img, detections, levels, weights, 1.1, 3, 0, Size(), Size(), true);
    cerr << "Detection " << detections[0] << " with weight " << weights[0] << endl;
    */
    CV_WRAP_AS(detectMultiScale3) void detectMultiScale( InputArray image,
                                  CV_OUT std::vector<Rect>& objects,
                                  CV_OUT std::vector<int>& rejectLevels,
                                  CV_OUT std::vector<double>& levelWeights,
                                  double scaleFactor = 1.1,
                                  int minNeighbors = 3, int flags = 0,
                                  Size minSize = Size(),
                                  Size maxSize = Size(),
                                  bool outputRejectLevels = false );

    CV_WRAP bool isOldFormatCascade() const;
    CV_WRAP Size getOriginalWindowSize() const;
    CV_WRAP int getFeatureType() const;
    void* getOldCascade();

    CV_WRAP static bool convert(const String& oldcascade, const String& newcascade);

    void setMaskGenerator(const Ptr<BaseCascadeClassifier::MaskGenerator>& maskGenerator);
    Ptr<BaseCascadeClassifier::MaskGenerator> getMaskGenerator();

    Ptr<BaseCascadeClassifier> cc;
};
(2)detectMultiScale

调用分类器内部的成员函数detectMultiScale(多尺度检测)
参数1:image–待检测图片,一般为灰度图像加快检测速度;
参数2:objects–被检测物体的矩形框向量组;
参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个),每一个人脸至少要检测到多少次才算是真的人脸。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;
参数5:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为
CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;决定是缩放分类器来检测,还是缩放图像。
参数6、7:minSize和maxSize用来限制得到的目标区域的范围。表示人脸的最大最小尺寸。

参数3设置测试情况,参考网上的,目测没啥卵用。:
传1.1:400张测试图片识别率为85.3%。
传1.2:400张测试图片识别率为78.7%。
传1.05: 400张测试图片识别率为94.0%。

#define CV_HAAR_DO_CANNY_PRUNING 1 //这个值告诉分类器跳过平滑(无边缘)区域
#define CV_HAAR_SCALE_IMAGE 2 //这个值告诉分类器不要缩放分类器,而是缩放图像
#define CV_HAAR_FIND_BIGGEST_OBJECT 4 //告诉分类器只返回最大的目标
#define CV_HAAR_DO_ROUGH_SEARCH 8 //它只能和上面一个参数一起使用,告诉分类器在任何窗口,只要第一个候选者被发现则结束搜寻。

在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到,文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。

(3)rect

如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能:
rect.area(); //返回rect的面积 5000
rect.size(); //返回rect的尺寸 [50 × 100]
rect.tl(); //返回rect的左上顶点的坐标 [100, 50]
rect.br(); //返回rect的右下顶点的坐标 [150, 150]
rect.width(); //返回rect的宽度 50
rect.height(); //返回rect的高度 100
rect.contains(Point(x, y)); //返回布尔变量,判断rect是否包含Point(x, y)点

通过faces.size()来判断是否检测到人脸,返回0说明未检测到人脸,返回1表示检测到一个人脸。依次类推,通过该参数返回判断检测到的人脸个数。

1.5 人脸识别
(1)FaceRecognizer

人脸识别的类FaceRecognizer

class FaceRecognizer : public Algorithm
{
public:
    //! virtual destructor
    virtual ~FaceRecognizer() {}

    // Trains a FaceRecognizer.
    virtual void train(InputArray src, InputArray labels) = 0;

    // Updates a FaceRecognizer.
    virtual void update(InputArrayOfArrays src, InputArray labels);

    // Gets a prediction from a FaceRecognizer.
    virtual int predict(InputArray src) const = 0;

    // Predicts the label and confidence for a given sample.
    virtual void predict(InputArray src, int &label, double &confidence) const = 0;

    // Serializes this object to a given filename.
    virtual void save(const string& filename) const;

    // Deserializes this object from a given filename.
    virtual void load(const string& filename);

    // Serializes this object to a given cv::FileStorage.
    virtual void save(FileStorage& fs) const = 0;

    // Deserializes this object from a given cv::FileStorage.
    virtual void load(const FileStorage& fs) = 0;

    // Sets additional information as pairs label - info.
    void setLabelsInfo(const std::map<int, string>& labelsInfo);

    // Gets string information by label
    string getLabelInfo(const int &label);

    // Gets labels by string
    vector<int> getLabelsByString(const string& str);
};
(2)opencv Ptr

OpenCV中使用的智能指针。类似于std::smart_ptr,但是在OpenCV中可以用Ptr轻松管理各种类型的指针。
//可以用Ptr ptr代替MyObjectType* ptr,MyObjectType可以是C的结构体或C++的类,
智能指针有空再研究吧。

OpenCV笔记(Ptr) - fireae - 博客园 https://www.cnblogs.com/fireae/p/3684915.html
C++11中智能指针的原理、使用、实现 - wxquare - 博客园 https://www.cnblogs.com/wxquare/p/4759020.html

(3)目前支持的三种算法

Eigenfaces 特征脸createEigenFaceRecognizer()
Fisherfaces createFisherFaceRecognizer()
LocalBinary Patterns Histograms局部二值直方图 createLBPHFaceRecognizer()

(4)predict的用法

方法1:

int predict = 0;
predict = model->predict(compImage);

将照片传入predict接口,会返回训练照片中最接近的照片标签值。train(images,labels);labels这个容器包含了所有训练照片的标签。
通过返回的标签值与自己预设司机的标签进行比对,如果不一样就显示人脸识别失败。

方法2:
通过阀值设定来控制人脸识别准确度。
在创建人脸识别算法的过程中也可以将阀值传递进去
model = createEigenFaceRecognizer(0, SIMILAR_VALUE);
这样的话predict接口就不会返回有效数据。
1
如果创建过程中不添加。

之后可以通过对返回的predictLabel和predictConfidence进行判断是否人脸识别成功。

int predictLabel = -1;
double predictConfidence = 0.0;
model->predict(compImage, predictLabel, predictConfidence);
	if (predictLabel == targetFaceIndex && predictConfidence <= SIMILAR_VALUE) {
		cout<<"[cwr] Face recognition successful"<<endl;
		s_faceRecognitionSuc++;
	} else {
		cout<<"[cwr] Face recognition fail"<<endl;
		s_faceRecognitionFail++;
	}

官网说明

FaceRecognizer — OpenCV 2.4.13.7 documentation https://docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_api.html#facerecognizer-predict

FaceRecognizer::predict
C++: int FaceRecognizer::predict(InputArray src) const = 0
C++: void FaceRecognizer::predict(InputArray src, int& label, double& confidence) const = 0
Predicts a label and associated confidence (e.g. distance) for a given input image.
The suffix const means that prediction does not affect the internal model state, so the method can be safely called from within different threads.
The following example shows how to get a prediction from a trained model:
using namespace cv;
// Do your initialization here (create the cv::FaceRecognizer model) ...
// ...
// Read in a sample image:
Mat img = imread("person1/3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
// And get a prediction from the cv::FaceRecognizer:
int predicted = model->predict(img);

Or to get a prediction and the associated confidence (e.g. distance):
using namespace cv;
// Do your initialization here (create the cv::FaceRecognizer model) ...
// ...
Mat img = imread("person1/3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
// Some variables for the predicted label and associated confidence (e.g. distance):
int predicted_label = -1;
double predicted_confidence = 0.0;
// Get the prediction and associated confidence from the model
model->predict(img, predicted_label, predicted_confidence);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人脸识别demo分析(opencv版本) 的相关文章

  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 如何在 OpenCV 中删除 mouseCallback

    在使用 C 的 OpenCV 中 有没有办法删除 mouseHandler int event int x int y int flags void param 通过函数添加到窗口 image window cv setMouseCallb
  • ECC 导致多光谱图像的图像对齐失败

    我正在尝试将 RGB 图像与 IR 图像 单通道 对齐 目标是创建 4 通道图像 R G B IR 为了做到这一点 我正在使用cv2 findTransformECC如中所述这个非常简洁的指南 https learnopencv com i
  • 使用 Azure 机器学习检测图像中的符号

    4年前我发帖这个问题 https stackoverflow com q 6999920 411094不幸的是 得到的一些答案超出了我的技能水平 我刚刚参加了一次构建巡演会议 他们在会上谈论了机器学习 这让我想到了使用 ML 来解决我的问题
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 如何获得垂直线穿过的完整内轴线?

    我有一个图像 我想获取穿过其中轴的像素 我尝试使用骨架化 and 中轴方法来获取它们 但这两种方法都返回比相应对象短的一维线 这是带有示例图像的代码 gt gt gt import skimage filter gt gt gt impor
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 使用 OpenCV VideoWriter 将 RTSP 流存储为视频文件

    我正在使用 OpenCV 开发一个 Python 模块 该模块连接到 RTSP 流以对视频执行一些预处理 主要是降低 fps 和分辨率 然后将其存储在文件系统中 但是 即使在尝试了几种编解码器 寻找类似的开发之后 我总是得到一个空的视频 我
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • OpenCV Python RTSP 流

    我想使用 RTSP 从 IP 摄像机流式传输视频 但我有一个问题 我已经安装了先决条件 而且我的 RTSP 链接可以在 VlC 播放器上运行 但是当我在编辑器中尝试并运行它时 它说找不到相机 这是我的代码 import cv2 import
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 使用 pygtk3 将 GUI 窗口添加到 python opencv2 程序

    我已经使用Python和Opencv2完成了一个程序 现在 我想向我的程序添加一个 GUI 窗口 我对 PyGtk3 有一些经验 因此 我修改了代码以采用 PyGtk3 但是 我遇到了错误 因此 我尝试了一个简单的程序来找出实际的错误 我的
  • 如何识别与我的对象相关的轮廓并找到它们的几何质心

    问题陈述和背景信息 EDIT 约束 法兰上的红色会随着时间的推移而变化 所以我此时不会尝试使用颜色识别来识别我的对象 除非它足够强大 此外 外部照明也可能是一个因素 因为将来这将是在室外区域 我有 RGB 深度相机 有了它 我就能捕捉到这个
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np

随机推荐

  • nodejs-post文件上传原理详解

    转自 http cnodejs org topic 4f16442ccae1f4aa270010ad 基础知识 浅谈HTTP中Get与Post的区别 HTTP请求报文格式 简单介绍下 如下图 其中请求报文中的开始行和首部行包含了常见的各种信
  • 服务器里面的文件怎么传送,FTP服务器怎么传送局域网文件

    现如今 网络的使用已经十分普遍 同时也会有各种各样的局域网知识出现 比如 FTP服务器怎么传送局域网文件 学习啦小编在这里为大家详细介绍 使用局域网传送文件的朋友也许都遇过这样的悲事 自己在拷贝移动一个大的文件的时候 在最后几分钟就会完成
  • 企业数字化转型痛点,低代码平台如何解决?

    编者按 数字化能力建设整体尚处于初级阶段 虽然数字技术的发展已经从互联网 大数据时代迈入人工智能时代 但很多企业的数字化转型总体表现并不理想 那么面对数字化转型的痛点 低代码平台是如何解决的呢 来跟小编一起往下看 关键词 可视化开发 API
  • There is no ‘Animation’ attached to the “Player” game object

    There is no Animation attached to the Player game object 在照着龚老师的Unity3D投篮游戏视频教程练习时 遇到这个错误提示 我知道意思 就是player模型导入时 动画没有正确的加
  • Apache logs目录下找不见access.log文件解决办法

    Apache logs目录下找不见access log文件解决办法 原文链接请点击 https www cnblogs com ruoli s p 14561391 html 今天在做测试的时候 忽然发现 咦 我的apache服务器logs
  • 学习java和html必须要知道的英文单词(入门单词,包括C#)

    以前听说学习编程不需要记太多的英语单词 但是我在学习的时候还是碰到许多重要的编程单词 这里给大家稍微整理了一下 非常适合我们这些萌新 一 java入门基础学习单词 第一篇 public p bl k 公开 static st t k 静态
  • java代码审查

    一 概述 代码审查 Code Review 是消灭Bug最重要的方法之一 这些审查在大多数时候都特别奏效 由于代码审查本身所针对的对象 就是俯瞰整个代码在测试过程中的问题和Bug 并且 代码审查对消除一些特别细节的错误大有裨益 尤其是那些能
  • 基于Python/Tkinter的拼图单机小游戏

    这是很早之前写的拼图游戏 基于Py Tk 今天翻出来 然后重新整理 并且发布出来 供大家参考学习 自己看CSDN里有很多了类似的游戏代码 虽然代码逻辑上大同小异 但每个开发者都有自己独特的开发个性和习惯 这并无优劣 而且都可以从代码中都可以
  • Hive 调优总结2

    无需MapReduce 在hive default xml中hive fetch task conversion默认是more 老版本是minimal 该属性改为more后 在全局查找 字段查找 limit查找等都不走mapreduce E
  • 使用ffmpeg将视频文件(Mp4)转换为.ts格式文件,并通过nginx代理在前端访问

    废话不多说 直接上代码 1 编写工具类 Mp4ToTsUtils import java io BufferedReader import java io File import java io IOException import jav
  • 来了,MyBatisPlus的join联表查询!

    来源 juejin cn post 7110405284811522085 使用方法 安装 使用 核心类 MPJLambdaWrapper和MPJQueryWrapper MPJLambdaWrapper用法 MPJQueryWrapper
  • At32f421/gd32f103c6/stmf030

    ADF16ST V5 0遥控器 nf2401 bk2425 2 4g 连接 单片机 spi2 pb port bk3431 蓝牙 连接 单片机 uart3 bk2451 连接单片机 uart1 Q20 A77E BK343 供电控制 R61
  • 分布式系统理论

    说到分布式系统 不得不说集中式系统 传统集中式系统中整个项目所有的东西都在一个应用里面 一个网站就是一个应用 当系统压力较大时 只能横向扩展 增加多个服务器或者多个容器去做负载均衡 避免单点故障而影响到整个系统 集中式最明显的优点就是开发
  • 未授权访问的MongoDB修复方案

    修复方法 1 不要把MongoDB服务器部署在互联网上或者DMZ 开启MongoDB的授权访问 编辑 etc mongo conf 文件 找到 auth true 去掉注释 创建用户管理员 另外再连接MongoDB的时候 public cl
  • Mysql(9)_视图

    1 视图是什么 首先 视图是虚拟的表 是不存在的 若使用jdbc连接它 是会报错的 它本质上是sql语句 其次 物理表是真实存在的表 占用内存空间 视图没有实际的物理记录 而表有 视图 view 是在基本表之上建立的表 它的结构 即所定义的
  • 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)

    1 基本概念 算法改进入口 网络设计 特征流 损失函数 数据集的重要性 只要有一个好的 针对性的数据集 问题都可以解决 过集成新一代AutoML技术 可降低算法试错成本 人体姿态估计 Human Pose Estimation 是指图像或视
  • 字典序及1-n之间的数按字典序排列

    今天在刷LeetCode的时候遇见了一道题 题的要求是 给你一个整数 n 按字典序返回范围 1 n 内所有整数 你必须设计一个时间复杂度为 O n 且使用 O 1 额外空间的算法 开始以为是简单的输出 提交后发现与答案相差甚多 看评论后方了
  • xmind右键无法创建

    xmind右键菜单无法创建 前言 安装xmind 设置鼠标右键菜单 验证是否修复成功 后语 前言 前言 hello 不知大家在安装完xmind后 回到桌面后是否可以右键新建xmind文件 如果不行的话 那我就希望这篇文章能帮到你啦 安装xm
  • for in 循环详解

    for i 循环的作用 for in 语句以任意顺序迭代一个对象的除 Symbol 以外的可枚举属性 包括继承的可枚举属性 for in 是为遍历对象属性而构建的 不建议与数组一起使用 在处理有 key value 数据 用于获取对接的 k
  • 人脸识别demo分析(opencv版本)

    一 faceRecognition接口说明 函数名 faceRecognition 函数描述 人脸识别 参数 int recognitionPic 识别的照片 int targetFaceIndex 目标匹配照片索引值 返回 失败返回 1