Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和C++;HOG目标检测的实现 我在Python和C++中使用OPENCV实现了HOG人脸检测器。我试图保持两个实现中的代码完全相同。然而,我在这两方面都得到了不同的结果。在Python中,它工作正常,但是在C++中显示了完全错误的结果。下面是它们的输出示例(第一个是Python,第二个是C++): _Python_C++_Opencv_Computer Vision_Object Detection - Fatal编程技术网

Python和C++;HOG目标检测的实现 我在Python和C++中使用OPENCV实现了HOG人脸检测器。我试图保持两个实现中的代码完全相同。然而,我在这两方面都得到了不同的结果。在Python中,它工作正常,但是在C++中显示了完全错误的结果。下面是它们的输出示例(第一个是Python,第二个是C++):

Python和C++;HOG目标检测的实现 我在Python和C++中使用OPENCV实现了HOG人脸检测器。我试图保持两个实现中的代码完全相同。然而,我在这两方面都得到了不同的结果。在Python中,它工作正常,但是在C++中显示了完全错误的结果。下面是它们的输出示例(第一个是Python,第二个是C++): ,python,c++,opencv,computer-vision,object-detection,Python,C++,Opencv,Computer Vision,Object Detection,首先,我为这两种实现训练了一个OpenCV线性SVM分类器,并将它们保存在XML文件(模型文件)中。然后,我从模型(XML文件)中提取用于Pothon实现和用于C++实现的系数(用于在测试过程中定制HOG检测器)。也就是说,在测试过程中,这些系数将成为函数setsvmdetor(const std::vectorinput_coverties)的输入 理想情况下,这些系数应该相同,因为它们是从同一数据集使用OpenCV计算的。我通过将它们保存在两种实现的文本文件中手动检查了这些系数值,发现它们几

首先,我为这两种实现训练了一个OpenCV线性SVM分类器,并将它们保存在XML文件(模型文件)中。然后,我从模型(XML文件)中提取用于Pothon实现和用于C++实现的系数(用于在测试过程中定制HOG检测器)。也就是说,在测试过程中,这些系数将成为函数setsvmdetor(const std::vectorinput_coverties)的输入

理想情况下,这些系数应该相同,因为它们是从同一数据集使用OpenCV计算的。我通过将它们保存在两种实现的文本文件中手动检查了这些系数值,发现它们几乎相同。因此,我希望我未来定制的HOG检测器在这两种实现中的工作方式几乎相同

下面是使用这两种实现在测试图像中检测人脸的测试代码

Python实现:

import cv2
im = cv2.imread("..\\test_imgs\\1.png", 0) # test image
hog = cv2.HOGDescriptor((96, 128), (16,16), (8,8), (8,8), 9)

coeffs = pickle.load(open("coeffs_from_model")) # load coeffs already computed from model
hog.setSVMDetector( np.array(coeffs)) # customize HOG detector

found, w = hog.detectMultiScale(im,  winStride=(8,8), padding=(32,32), scale=4.05)
draw_detections(im, found_filtered) # method for drawing BBs on image
C++实现:

cv::Mat im = cv::imread("..\\test_imgs\\1.png", 0);
cv::HOGDescriptor hog(cv::Size(96, 128), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9);

LinearSVM svm; // check the link 
svm.load(model.c_str());

std::vector<float> coeffs;
svm.getSupportVector(coeffs); // compute coeffs from model

hog.setSVMDetector(coeffs); // customize HOG detector

std::vector<cv::Rect> found; // holds the detected BBs
hog.detectMultiScale(im, found, 0, cv::Size(8, 8), cv::Size(32, 32), 4.05); 
drawLocations(im, found, cv::Scalar(0, 255, 0)); // method for drawing BBs on the image. 
cv::Mat im=cv::imread(“..\\test\u imgs\\1.png”,0);
cv::猪(cv::大小(96128),cv::大小(16,16),cv::大小(8,8),cv::大小(8,8,9);
LinearSVM svm;//检查链接
load(model.c_str());
向量系数;
svm.getSupportVector(系数);//根据模型计算系数
hog.setsvm检测器(系数);//定制猪检测器
找到了std::vector;//保存检测到的BBs
hog.detectMultiScale(im,found,0,cv::Size(8,8),cv::Size(32,32),4.05);
绘图位置(im、find、cv::Scalar(0、255、0));//在图像上绘制BBs的方法。

以便检查C++计算的系数是否不正确。我在Python实现中使用了它们,有趣的是,它们的工作原理完全相同。所以,现在我不明白为什么C++实现中的HOG对象尽管正确的系数也不能正常工作。p>


我在C++中使用了HOG对象的初始化,就像Python一样,并且在两个实现中保持代码几乎相同,因为它们都使用相同的OpenCV。p> 我现在得到答案了。上面写的两个代码都是正确的。问题在于用于培训的标签。我在这两个实现中都使用了“0”(面类)和“1”(非面类)作为标签

Python实现的P>>,这个标签工作正常,但是,对于C++实现,它看起来像是“+1”(FACE类)和“--1”(非面向类),正如我发现的。在该示例中,在源代码末尾,标签如下所示:

// Set up training data
float labels[4] = {1.0, -1.0, -1.0, -1.0};
Mat labelsMat(4, 1, CV_32FC1, labels);

你能演示你的Python <代码> COFFS=KIPLE?Load(open(”CoffsSfFuxMug模型))< /Cord>正在做什么,你的C++ >代码> STD::向量COVEFS;getSupportVector(系数)正在执行?@板上的:我使用了C++实现中的系数,在Python测试代码中。而且,它在那里工作完全正确。我还做了另一种方法,即使用Python中计算的系数(它已经在C++测试代码中工作)。但是,它显示的错误与它自己的系数(C++系数)显示的错误几乎相同。由此,我总结了两个问题:(i)系数是正确的(Python或C++),(ii)C++实现中有一些错误,我仍然在努力解决。