我试图用在互联网上找到的源代码创建一个微笑检测器。它能检测人脸,效果很好。它使用了Haar分类器,我找到了用于微笑识别的Haar分类器,并尝试了它,但它不起作用。我试着用识别人脸的方法来使用它。用眼睛分类器也尝试了同样的方法,并且成功了。我在opencv/data文件夹中找到的所有分类器,有人能给我一个提示吗?我可以用给定的代码做更多的事情吗?
import java.io.File;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
public class SmileDetector {
public void detectSmile(String filename) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.out.println("\nRunning SmileDetector");
CascadeClassifier faceDetector = new CascadeClassifier(new File(
"src/main/resources/haarcascade_frontalface_alt.xml").getAbsolutePath());
CascadeClassifier smileDetector = new CascadeClassifier(
new File("src/main/resources/haarcascade_smile.xml").getAbsolutePath());
Mat image = Highgui.imread(filename);
MatOfRect faceDetections = new MatOfRect();
MatOfRect smileDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
}
Mat face = image.submat(faceDetections.toArray()[0]);
smileDetector.detectMultiScale(face, smileDetections);
for (Rect rect : smileDetections.toArray()) {
Core.rectangle(face, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
}
String outputFilename = "ouput.png";
System.out.println(String.format("Writing %s", outputFilename));
Highgui.imwrite(outputFilename, image);
Highgui.imwrite("ee.png", face);
}
}
回答Vi Matviichuk评论:是的,我部分能够解决这个问题。我用嘴分类器代替了微笑,opencv样本中的嘴html" target="_blank">分类器的名字是haarcascade_mcs_mouth.xml;然后你寻找脸,裁剪它们,在脸上寻找嘴。然而,它会给你很多嘴,所以你必须通过以下方式过滤它们:
/**
* Detects face(s) and then for each detects and crops mouth
*
* @param filename path to file on which smile(s) will be detected
* @return List of Mat objects with cropped mouth pictures.
*/
private ArrayList<Mat> detectMouth(String filename) {
int i = 0;
ArrayList<Mat> mouths = new ArrayList<Mat>();
// reading image in grayscale from the given path
image = Highgui.imread(filename, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
MatOfRect faceDetections = new MatOfRect();
// detecting face(s) on given image and saving them to MatofRect object
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
MatOfRect mouthDetections = new MatOfRect();
// detecting mouth(s) on given image and saving them to MatOfRect object
mouthDetector.detectMultiScale(image, mouthDetections);
System.out.println(String.format("Detected %s mouths", mouthDetections.toArray().length));
for (Rect face : faceDetections.toArray()) {
Mat outFace = image.submat(face);
// saving cropped face to picture
Highgui.imwrite("face" + i + ".png", outFace);
for (Rect mouth : mouthDetections.toArray()) {
// trying to find right mouth
// if the mouth is in the lower 2/5 of the face
// and the lower edge of mouth is above of the face
// and the horizontal center of the mouth is the enter of the face
if (mouth.y > face.y + face.height * 3 / 5 && mouth.y + mouth.height < face.y + face.height
&& Math.abs((mouth.x + mouth.width / 2)) - (face.x + face.width / 2) < face.width / 10) {
Mat outMouth = image.submat(mouth);
// resizing mouth to the unified size of trainSize
Imgproc.resize(outMouth, outMouth, trainSize);
mouths.add(outMouth);
// saving mouth to picture
Highgui.imwrite("mouth" + i + ".png", outMouth);
i++;
}
}
}
return mouths;
}
然后你必须找到一个微笑,我试着用SVM训练机来做这个,但是我没有足够的样本,所以它不是完美的。但是,我得到的全部代码可以在这里找到:https://bitbucket.org/cybuch/smile-detector/src/ac8a309454c3467ffd8bc1c34ad95879cb059328/src/main/java/org/cybuch/smiledetector/SmileDetector.java?at=master
我想通过Grails 3后端从MySQL数据库中的iOS应用程序中保存微笑。到目前为止,我设法改变我的MySQL排序等utf8mb4,但我没有找到正确的方式如何连接我的后端到MySQL通过utf8mb4字符集。 我的连接url是: 将字符编码或字符集更改为utf8mb4会导致错误:不支持的字符编码'utf8mb4'。 我在build.gradle中的grails连接器是运行时'mysql: mys
我试图理解这段代码是如何用于冲突检测的。我知道目标是一个边界框,并且我们正在测试实体的每个可能点,但是我不确定带符号移位运算符在这种情况下的用途。事实上,我甚至不明白它为什么会有用,只是它的作用。谁能详细说明一下? 可能值得注意的是,实体按像素知道其确切的x和y位置,但一个瓷砖根本不知道它的位置。天下有瓦阵,却只知其瓦位……因此,当需要进行碰撞检测时,函数必须确定从玩家位置得到哪个平铺位置。 全文
我创建了这个类: 在服务中: 我想知道,在开玩笑的情况下,是否可以这样做:
除非我误解了什么,否则resolves和rejects(https://facebook.github.io/jest/docs/expect.htmlet.resolves)在vNext之前都是不可用的。现在/同时,用玩笑来检验诺言的推荐方法是什么?难道这只是把期望放在那里和抓到吗? 例如: 2019年6月15号更新:在我发布这个问题后不久,Jest就开始支持这个开箱即用。我改变了下面接受的答案
问题内容: 我在带有打字稿的React Router v5.1.2中使用UseHistory挂钩吗?运行单元测试时,我遇到了问题。 TypeError:无法读取未定义的属性“ history”。 我也尝试使用,但仍然无法正常工作。 问题答案: 浅化使用的反应功能组件时,我需要相同的内容。 在我的测试文件中解决了以下模拟问题:
我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2