Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.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
Ios 使用OpenCV检测上半身部位_Ios_Opencv_Detection - Fatal编程技术网

Ios 使用OpenCV检测上半身部位

Ios 使用OpenCV检测上半身部位,ios,opencv,detection,Ios,Opencv,Detection,我正在做一个与OpenCV集成的iOS项目。我想要的输出是这样的: 如何检测上半身部位(即:从颈部到腿部)? 到目前为止,我所做的身体检测是这样的。。 如果以前有人做过这个,请帮帮我。。 -(void)processImage:(Mat&)image { std::载体体; matgrayscaleframe; CVT颜色(图像、灰度、CV_bgr2灰色); 均衡器历史(GrayScaleName,GrayScaleName); upperBodyCascade.detectMultiSc

我正在做一个与OpenCV集成的iOS项目。
我想要的输出是这样的:

如何检测上半身部位(即:从颈部到腿部)?
到目前为止,我所做的身体检测是这样的。。
如果以前有人做过这个,请帮帮我。。

-(void)processImage:(Mat&)image
{
std::载体体;
matgrayscaleframe;
CVT颜色(图像、灰度、CV_bgr2灰色);
均衡器历史(GrayScaleName,GrayScaleName);
upperBodyCascade.detectMultiScale(灰度值、图像、实体、HaarOptions、cv::Size(30,30));
对于(size_t i=0;i
您可以使用

你可以找到一个例子。您只需要更改加载的分类器

代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

/** Function Headers */
void detectAndDisplay(Mat frame);

/** Global variables */
String upper_body_cascade_name = "path\\to\\haarcascade_upperbody.xml";
CascadeClassifier upper_body_cascade;
string window_name = "Capture - Upper Body detection";
RNG rng(12345);

/** @function main */
int main(int argc, const char** argv)
{
    VideoCapture capture(0);
    Mat frame;

    //-- 1. Load the cascades
    if (!upper_body_cascade.load(upper_body_cascade_name)){ printf("--(!)Error loading\n"); return -1; };

    //-- 2. Read the video stream
    if (capture.isOpened())
    {
        while (true)
        {
            capture >> frame;

            //-- 3. Apply the classifier to the frame
            if (!frame.empty())
            {
                detectAndDisplay(frame);
            }
            else
            {
                printf(" --(!) No captured frame -- Break!"); break;
            }

            int c = waitKey(10);
            if ((char)c == 'c') { break; }
        }
    }
    return 0;
}

/** @function detectAndDisplay */
void detectAndDisplay(Mat frame)
{
    std::vector<Rect> bodies;
    Mat frame_gray;

    cvtColor(frame, frame_gray, CV_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);

    //-- Detect faces
    upper_body_cascade.detectMultiScale(frame_gray, bodies, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

    for (size_t i = 0; i < bodies.size(); i++)
    {
        rectangle(frame, bodies[i], Scalar(255, 0, 255));
    }
    //-- Show what you got
    imshow(window_name, frame);
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
/**函数头*/
空隙检测和显示(垫架);
/**全局变量*/
字符串upper\u body\u cascade\u name=“path\\to\\haarcascade\u upper body.xml”;
级联分类器上体级联;
字符串窗口\u name=“捕获-上身检测”;
RNG RNG(12345);
/**@主功能*/
int main(int argc,常量字符**argv)
{
视频捕获(0);
垫架;
//--1.加载叶栅
如果(!upper_body_cascade.load(upper_body_cascade_name)){printf(“-(!)Error load\n”);返回-1;};
//--2.读取视频流
if(capture.isOpened())
{
while(true)
{
捕获>>帧;
//--3.将分类器应用于框架
如果(!frame.empty())
{
检测显示(帧);
}
其他的
{
printf(“-(!)未捕获帧--Break!”);Break;
}
int c=等待键(10);
如果((char)c=='c'){break;}
}
}
返回0;
}
/**@功能检测和显示*/
空隙检测和显示(垫架)
{
std::载体体;
垫子框架为灰色;
CVT颜色(框架、框架灰、CV灰);
均衡器历史(帧灰,帧灰);
//--检测人脸
上半身级联。检测多尺度(帧灰度,身体,1.1,2,0;CV|u HAAR|u尺度图像,大小(30,30));
对于(size_t i=0;i
我用过它。但是这里使用的方法对我不起作用。mat方法中使用的循环需要changed@magid这将起作用(请参阅更新的答案)。如果结果对你不满意,考虑培训你自己的分类器。这里需要更改mat方法中使用的循环非常模糊。你是什么意思?我已经添加了所需的输出,请检查。。现在没有错误,但它正在检测其他对象。。连尸体都没有parts@Miki谢谢你的回答。。在哪里可以获得面部正面和侧面视图的
xml
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

/** Function Headers */
void detectAndDisplay(Mat frame);

/** Global variables */
String upper_body_cascade_name = "path\\to\\haarcascade_upperbody.xml";
CascadeClassifier upper_body_cascade;
string window_name = "Capture - Upper Body detection";
RNG rng(12345);

/** @function main */
int main(int argc, const char** argv)
{
    VideoCapture capture(0);
    Mat frame;

    //-- 1. Load the cascades
    if (!upper_body_cascade.load(upper_body_cascade_name)){ printf("--(!)Error loading\n"); return -1; };

    //-- 2. Read the video stream
    if (capture.isOpened())
    {
        while (true)
        {
            capture >> frame;

            //-- 3. Apply the classifier to the frame
            if (!frame.empty())
            {
                detectAndDisplay(frame);
            }
            else
            {
                printf(" --(!) No captured frame -- Break!"); break;
            }

            int c = waitKey(10);
            if ((char)c == 'c') { break; }
        }
    }
    return 0;
}

/** @function detectAndDisplay */
void detectAndDisplay(Mat frame)
{
    std::vector<Rect> bodies;
    Mat frame_gray;

    cvtColor(frame, frame_gray, CV_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);

    //-- Detect faces
    upper_body_cascade.detectMultiScale(frame_gray, bodies, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

    for (size_t i = 0; i < bodies.size(); i++)
    {
        rectangle(frame, bodies[i], Scalar(255, 0, 255));
    }
    //-- Show what you got
    imshow(window_name, frame);
}