我目前正在使用Haar分类器来检测物体.在我的路上,我不明白什么是minNeighbors参数,它代表什么?实际上我不明白检测候选矩形的邻居是什么.任何人都可以定义相邻的想法吗?
今天我开始测试在Java和OpenCv中检测微笑的项目.为了识别面部和嘴部项目使用haarcascade_frontalface_alt和haarcascade_mcs_mouth但我不明白为什么在某些原因项目检测鼻子作为一个嘴.我有两种方法:
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()) { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个哈尔分类器来识别对象但是我似乎无法弄清楚每个阶段产生的结果表代表什么.
例如1
===== TRAINING 1-stage =====
<BEGIN
POS count : consumed 700 : 700
NEG count : acceptanceRatio 2500 : 0.452161
Precalculation time: 9
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 1|
+----+---------+---------+
| 2| 1| 1|
+----+---------+---------+
| 3| 1| 1|
+----+---------+---------+
| 4| 1| 1|
+----+---------+---------+
| 5| 1| 0.7432|
+----+---------+---------+
| 6| 1| 0.6312|
+----+---------+---------+
| 7| 1| 0.5112|
+----+---------+---------+
| 8| 1| 0.6104|
+----+---------+---------+
| 9| 1| 0.4488|
+----+---------+---------+
END>
Run Code Online (Sandbox Code Playgroud)
例如2 …
我正在使用训练有素的opencv级联分类器来检测视频帧中的手,并希望降低我的误报率.在网上读了起来,我看见你可以通过访问这样做
rejectLevels
,并levelWeights
通过detectMultiScale方法返回的信息.我在这里看到这在C++中是可能的,我的问题是 - 有没有人设法用Python做到这一点?这里也提出了一个类似的问题,但它是针对早期版本的检测方法.
如果可能,调用该方法的正确语法是什么?如果它适合您,请提及您正在使用的OpenCV版本.我在2.4.9.
2.4.11 API提供以下语法
Python: cv2.CascadeClassifier.detectMultiScale(image, rejectLevels, levelWeights[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize[, outputRejectLevels]]]]]])
Run Code Online (Sandbox Code Playgroud)
因此,我已经尝试过了
import cv2
import cv2.cv as cv
import time
hand_cascade = cv2.CascadeClassifier('cascade.xml')
img = cv2.imread('test.jpg')
rejectLevels = []
levelWeights = []
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = hand_cascade.detectMultiScale(gray,rejectLevels,levelWeights, 1.1, 5,cv.CV_HAAR_FIND_BIGGEST_OBJECT,(30, 30),(100,100),True)
Run Code Online (Sandbox Code Playgroud)
但我得到的输出是
[[259 101 43 43]
[354 217 43 43]
[240 189 43 43]
[316 182 47 47]
[277 139 92 92]]
[]
[] …
Run Code Online (Sandbox Code Playgroud) (这有点长,但这主要是一个难以理解的解释:)
对于我有一个项目,我需要识别一般形式的对象 -
在包含不同形状的更大图像里面,像这样 -
正如你所看到的,我正在寻找的对象是一条红线,每边都有十字架(最后一张图片中有5条).我有一个大约4,000张图像库,我需要在其中找到对象,其中一些包含这些对象,而其中一些不像这样的图像 -
经过一些研究,我认为使用haar级联和openCV是要走的路,所以我写了一个脚本,遍历上面提到的所有4000个图像和提取分离轮廓,就像这个问题中的第一个图像.
然后,我经历了许多轮廓,抓住了大约150个(即150个文件只包含我需要的对象,类似于第一个图像)和大约180个不包含我需要的对象的图像(类似于这里的第三张图片).
然后我开始使用几个教程开始训练过程,但主要是这个.
在这样做时,我遇到了一个问题 - 正如你所看到的,所需的双交叉物体的图像大小不同,甚至没有相同的比例(因为它们可以以任何角度出现 - 水平,对角线等等.).
起初我尝试使用具有不同维度的图像,但这导致了训练过程中的错误,因此,为了解决这个问题,我已将所有正面图像的尺寸更改为350x350(其中一个最大尺度)对象).为了清楚 - 我没有调整图像大小 - 我只是添加了空白区域,使所有图像都是350x350像素.
然后我按照教程中的建议完成了训练过程 - 我创建了样本(宽度 - 24,高度 - 24)并创建了一个级联xml文件,结果证明不是很大(45kb).
现在,我知道150个正面图像和180个负面图像不是很多,但我想在我过滤更多图像并将更多时间投入其中之前至少得到一个概念验证工作.
当cascade.xml文件完成后,我尝试用它来定位一些图像中的一些对象(使用cv2.CascadeClassifier('cascade.xml')
和cascade.detectMultiScale(img)
但是每次尝试都返回零结果.
最后我甚至试图在一个正面图像中找到一个对象(除了一个所需的对象之外什么都没有),但它也返回零结果.
我尝试调整参数,cascade.detectMultiScale(img)
目前我正在训练一个36x36样本的级联文件,但我不相信它会起作用.
由于我对这些东西很陌生,我想知道我做错了什么,我想我会在这里问.
进一步来说:
如果我没有包含一些重要数据,请告诉我我会发布.
Dan,非常感谢你的帮助
我正在尝试建立haar级联来进行特定字体的OCR; 每个字符一个分类器.
我只需将字体绘制到图像上即可生成大量的训练数据.因此,计划是为每个角色生成积极的训练数据,并使用其他角色的示例作为负面训练数据.
我想知道我应该在训练数据中加入多少变化.通常情况下,我只是尝试一切,但我收集这些东西需要几天训练(对于每个角色!)所以一些建议会很好.
那么,有几个问题:
谢谢!
这个代码块(在views.py中)由URL触发.导入cv2时没有问题.(使用virtualenvwrapper尝试的同样的事情显示相同的结果(添加所有必需的库之后)相机初始化和....
def caminit(request):
cam.open(0)
img=cam.read()
cv2.imwrite("snap"+".jpg",img[1])
cam.release() #takes the instant pic
faceCascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
Run Code Online (Sandbox Code Playgroud)
检查时 print type(faceCascade)
给出<type 'cv2.CascadeClassifier'>
.对象已创建.
继续前进 caminit
image = cv2.imread("snap.jpg")
# when checked with image.dtype it shows correct uint8 also image.shape shows correct data {Eg: (480, 640, 3)}
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Detect faces in the image
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
Run Code Online (Sandbox Code Playgroud)
现在关键部分"寻找面孔的数量"
print "Found {0} faces!".format(len(faces))
Run Code Online (Sandbox Code Playgroud)
终端输出:
Found 0 faces!
Run Code Online (Sandbox Code Playgroud)
为什么会这样? …
这是我第一次使用openCV库.我想用它来检测眼睛.我使用了FdActivity
本教程中提供的代码:
http://romanhosek.cz/android-eye-detection-updated-for-opencv-2-4-6/
本教程使用OpenCV 2.4.6,但我在我的项目中下载了3.1版本.由于版本的不同,我更改了使用putText,矩形和圆形的行从imgproc而不是Core导入.这就是我改变的一切.我已将haarcascade_lefteye_2splits.xml和lbpcascade_frontalface.xml添加到res文件夹下的raw文件夹中.
运行应用程序时,我在logcat中收到此错误:
failed to load cascade classifier
Run Code Online (Sandbox Code Playgroud)
如果mJavaDetector或mJavaDetectorEye为空,则仅从这些行生成:
try {
// load cascade file from application resources
InputStream is = getResources().openRawResource(
R.raw.lbpcascade_frontalface);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir,
"lbpcascade_frontalface.xml");
FileOutputStream os = new FileOutputStream(mCascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
is.close();
os.close();
// --------------------------------- load left eye
// classificator -----------------------------------
InputStream iser = getResources().openRawResource(
R.raw.haarcascade_lefteye_2splits);
File cascadeDirER = getDir("cascadeER",
Context.MODE_PRIVATE); …
Run Code Online (Sandbox Code Playgroud) 我试图用openCV检测图像中的嘴,所以我使用以下代码:
#include "face_detection.h"
using namespace cv;
// Function detectAndDisplay
void detectAndDisplay(const std::string& file_name, cv::CascadeClassifier& face_cascade, cv::CascadeClassifier& mouth_cascade)
{
Mat frame = imread(file_name);
std::vector<Rect> faces;
Mat frame_gray;
Mat crop;
Mat res;
Mat gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
// Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for(unsigned int i=0;i<faces.size();i++)
{
rectangle(frame,faces[i],Scalar(255,0,0),1,8,0);
Mat face = frame(faces[i]);
cvtColor(face,face,CV_BGR2GRAY);
std::vector <Rect> mouthi;
mouth_cascade.detectMultiScale(face, mouthi);
for(unsigned int k=0;k<mouthi.size();k++)
{
Point pt1(mouthi[k].x+faces[i].x , mouthi[k].y+faces[i].y);
Point pt2(pt1.x+mouthi[k].width, pt1.y+mouthi[k].height);
rectangle(frame, pt1,pt2,Scalar(0,255,0),1,8,0);
}
}
imshow("Frame", …
Run Code Online (Sandbox Code Playgroud) 我采取了我的第一步,为自定义对象识别制作一个haar级联.我花时间获得了相当多的数据并编写了一些预处理脚本来将视频转换为帧.我的下一步是裁剪interes的对象,以创建一些积极的训练示例.我有几个问题,我真的在网上寻找答案 - 我有点困惑: -
我读到我的目标是保持纵横比相同 - 这是否与原始帧相同或者我想用于正面训练示例的所有图像(即来自完全不同视频的帧)
尺寸 - 纵横比和尺寸明显不一样.所以我还需要确保我的正面样本都具有相同的高度和宽度(我很确定它们应该是但是值得仔细检查).
另外在大小方面 - 我遇到过一些博客推荐例如24 x 24 H x W - 如果我想要检测的对象不是正方形(在我的情况下是一个矩形,其高度大约是其宽度的两倍)一个塑料瓶).我是否保持相同的尺寸或者我应该将其转换为24 x 24?
负样品 - 这些样品的长宽比和/或尺寸是否相同?
我知道这可能是一个非常低级别/愚蠢的问题,但是目前还不清楚最佳做法是什么!
我在这里遇到了其他几个答案,但我不觉得他们提供了一个满意的答案,并且该领域在过去几年里已经取得了显着进展
谢谢
algorithm opencv machine-learning computer-vision haar-classifier
haar-classifier ×10
opencv ×10
python ×2
algorithm ×1
android ×1
django ×1
java ×1
python-2.7 ×1
viola-jones ×1
xml ×1