Detecting/Segmenting 不使用经过训练的模型的人脸和面部特征:openCV C++
Detecting/Segmenting Face and Facial Features WITHOUT using a trained model: openCV C++
使用单张图片-我想知道是否可以检测一张图片中的人脸(object)和面部特征(眼睛、嘴巴、鼻子)而无需 使用一些预训练模型,例如 "haarcascade_eye" 或 "lbpcascade_frontalface" 或任何相关的东西。
我想在没有用户输入的情况下处理人脸,例如使用 selectROI() 手动选择感兴趣区域 (ROI)。我试图根据 openCV 教程对图像进行分割,但我正在努力将背景和 body 与头部分开。我也尝试过使用诸如 SIFT/SURF/FAST 之类的算法,但该算法检测随机关键点,如果我想检测面部标志,以后就没有用了。是否有人body 有他们愿意分享的示例、教程、想法或想法?
The image I am using
我想指出的是,当您 运行 筛选图像时,它会显示该图像中的所有 'points of interest'。你需要有一个基础图像来映射它,例如,保留眼睛的裁剪图像,或者你关注的任何面部标志。
您的代码必须从 'train' 和测试图像中提取关键点。完成后,您可以使用匹配函数,例如 BruteForce Matcher 或 FLANN。之后定义好匹配的门槛,你就可以开始了。
示例:
kp_train,des_train = sift.detectAndCompute(image_train,None)
kp_test,des_test = sift.detectAndCompute(image_test,None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des_train,des_test,k=2)
good = []
for m,n in matches[index]:
if m.distance < dist_ratio*n.distance:
good.append([m])
if len(good)>MIN_MATCH_COUNT:
img3 = cv2.drawMatchesKnn(image_train,keypoints_train,image_test,keypoints_test,good,None, flags=2)
cv2.imwrite("Path/To/Save",img3)
根据您的应用更改 MIN_MATCH_COUNT 的值
我建议您添加一个 homography 函数并使用 RANSAC 来去除异常值。有了这个,您甚至可以在您的投资回报率周围画一个框并提取它。
替代方法:您可以尝试模板匹配算法,例如 MSTM。该算法将采用基本图像并将其平铺在测试图像上,并检查它是否在任何地方都匹配。如果您的所有图像都与您所附的图像相似,MSTM 会有所帮助
P.s 很明显我正在使用 Python,您可以在 opencv 文档
上找到等效的 C++ 函数
以this为例
使用单张图片-我想知道是否可以检测一张图片中的人脸(object)和面部特征(眼睛、嘴巴、鼻子)而无需 使用一些预训练模型,例如 "haarcascade_eye" 或 "lbpcascade_frontalface" 或任何相关的东西。 我想在没有用户输入的情况下处理人脸,例如使用 selectROI() 手动选择感兴趣区域 (ROI)。我试图根据 openCV 教程对图像进行分割,但我正在努力将背景和 body 与头部分开。我也尝试过使用诸如 SIFT/SURF/FAST 之类的算法,但该算法检测随机关键点,如果我想检测面部标志,以后就没有用了。是否有人body 有他们愿意分享的示例、教程、想法或想法?
The image I am using
我想指出的是,当您 运行 筛选图像时,它会显示该图像中的所有 'points of interest'。你需要有一个基础图像来映射它,例如,保留眼睛的裁剪图像,或者你关注的任何面部标志。
您的代码必须从 'train' 和测试图像中提取关键点。完成后,您可以使用匹配函数,例如 BruteForce Matcher 或 FLANN。之后定义好匹配的门槛,你就可以开始了。
示例:
kp_train,des_train = sift.detectAndCompute(image_train,None)
kp_test,des_test = sift.detectAndCompute(image_test,None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des_train,des_test,k=2)
good = []
for m,n in matches[index]:
if m.distance < dist_ratio*n.distance:
good.append([m])
if len(good)>MIN_MATCH_COUNT:
img3 = cv2.drawMatchesKnn(image_train,keypoints_train,image_test,keypoints_test,good,None, flags=2)
cv2.imwrite("Path/To/Save",img3)
根据您的应用更改 MIN_MATCH_COUNT 的值
我建议您添加一个 homography 函数并使用 RANSAC 来去除异常值。有了这个,您甚至可以在您的投资回报率周围画一个框并提取它。
替代方法:您可以尝试模板匹配算法,例如 MSTM。该算法将采用基本图像并将其平铺在测试图像上,并检查它是否在任何地方都匹配。如果您的所有图像都与您所附的图像相似,MSTM 会有所帮助
P.s 很明显我正在使用 Python,您可以在 opencv 文档
上找到等效的 C++ 函数以this为例