21xrx.com
2024-09-20 05:31:26 Friday
登录
文章检索 我的文章 写文章
C++版黑人抬棺代码
2023-07-02 15:59:41 深夜i     --     --
C++ 黑人抬棺 代码 编程 模拟音效

黑人抬棺这段视频在近段时间在国内网络上爆红。因为视频中的背景音乐和舞蹈非常的具有感染力。于是,有不少程序员也开始折腾黑人抬棺的代码。今天我们就来介绍一下C++版黑人抬棺代码。

首先,我们需要知道,黑人抬棺的代码需要使用到OpenCV库,并且需要下载相应的训练集文件。最常用的训练集文件是HAAR特征,可以用来检测人脸和人眼。

下面这段代码是用于载入图像和分类器的函数:


Mat LoadImageAndClassifier(String ImageFileName, CascadeClassifier& FaceCascadeClassifier, String ClassifierXMLFileName) {

  Mat img = imread(ImageFileName, CV_LOAD_IMAGE_COLOR); //载入图像

  if (img.empty()) { //读入图像失败

    cout << "Error:Image file cannot open!" << endl;

    exit(0);

  }

  //载入分类器

  if (!FaceCascadeClassifier.load(ClassifierXMLFileName)) {

    cout << "Error:Classifier file cannot open!" << endl;

    exit(0);

  }

  return img;//返回载入的图像

}

上面这段代码中,`imread`函数用于从指定路径读取图像,如果读取失败则输出错误信息并退出。`load`函数则用于载入分类器,如果载入失败则同样输出错误信息并退出。最后返回读取成功的图像。

下面这段代码是用于检测图像中是否有人脸和人眼的函数:


void DetectFaceAndEye(Mat img, CascadeClassifier& FaceCascadeClassifier, CascadeClassifier& EyeCascadeClassifier) {

  vector<Rect> faces; //存储人脸检测结果

  vector<Rect> eyes; //存储人眼检测结果

  Mat img_gray; //定义灰度图像

  cvtColor(img, img_gray, CV_BGR2GRAY); //彩色图像转化为灰度图像

  equalizeHist(img_gray, img_gray); //直方图均衡化

  FaceCascadeClassifier.detectMultiScale(img_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); //进行人脸检测

  for (size_t i = 0; i < faces.size(); i++) { //遍历人脸

    Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); //得到人脸中心点

    ellipse(img, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); //绘制人脸椭圆

    Mat faceROI = img_gray(faces[i]); //将人脸裁剪出来进行人眼检测

    EyeCascadeClassifier.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); //进行人眼检测

    for (size_t j = 0; j < eyes.size(); j++) { //遍历人眼

      Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); //得到人眼中心点

      int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); //计算绘制圆形的半径

      circle(img, eye_center, radius, Scalar(255, 0, 0), 3, 8, 0); //绘制眼球的圆形

    }

  }

  imshow("Face and Eye Detection", img); //显示图像

}

上面这段代码中,`detectMultiScale`函数用于对人脸和人眼进行检测,并将结果存储在对应的`vector`中。然后,遍历每个检测结果,得到相应的中心位置和半径,最后使用OpenCV的绘图函数 `ellipse` 和`circle` 绘制出相应的椭圆和圆形。

最后,我们可以在主函数中调用这两个函数,载入图像和分类器,并进行检测。


int main() {

  CascadeClassifier face_cascade;

  CascadeClassifier eye_cascade;

  Mat img = LoadImageAndClassifier("image/1.jpg", face_cascade, "haarcascade_frontalface_alt.xml");//载入图片和人脸分类器

  LoadImageAndClassifier("image/1.jpg", eye_cascade, "haarcascade_eye.xml");//载入眼睛分类器

  DetectFaceAndEye(img, face_cascade, eye_cascade);//检测人脸和人眼

  waitKey(0);

  return 0;

}

运行程序后,我们就可以看到检测结果的窗口了。

以上就是C++版黑人抬棺代码的简单实现和解释。如果您对OpenCV和人脸检测感兴趣,不妨试着把这段代码实现一下吧。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复