C++ 将网络摄像头程序转换为处理一幅图像

C++ 将网络摄像头程序转换为处理一幅图像,c++,opencv,C++,Opencv,我目前正在尝试修改一个程序,该程序将网络摄像头流作为输入。问题是,当我尝试更改程序以使用单个图像时,它不会显示我期望的输出,例如视频流(下面的代码) #包括“opencv2/opencv.hpp” #包括“opencv2/imgcodecs.hpp” #包括“opencv2/imgproc.hpp” #包括“opencv2/videoio.hpp” #包括 #包括 #包括“BackgroundRemover.h” #包括“SkinDetector.h” #包括“FaceDetector.h” #

我目前正在尝试修改一个程序,该程序将网络摄像头流作为输入。问题是,当我尝试更改程序以使用单个图像时,它不会显示我期望的输出,例如视频流(下面的代码)

#包括“opencv2/opencv.hpp”
#包括“opencv2/imgcodecs.hpp”
#包括“opencv2/imgproc.hpp”
#包括“opencv2/videoio.hpp”
#包括
#包括
#包括“BackgroundRemover.h”
#包括“SkinDetector.h”
#包括“FaceDetector.h”
#包括“FingerCount.h”
使用名称空间cv;
使用名称空间std;
int main(int,char**){
视频捕获视频捕获(0);
videoCapture.set(CV\u CAP\u PROP\u设置,1);
如果(!videoCapture.isOpened()){
沙发架;
frameOut=frame.clone();
皮肤检测器。drawSkinColorSampler(frameOut);
前台=backgroundRemover.getForeground(frame);
面检测器。移除面(帧、前景);
手工sk=skinDetector.getSkinMask(前景);
fingerCountDebug=fingerCount.FindFingerScont(手工任务,帧输出);
imshow(“输出”,帧输出);
imshow(“前景”,前景);
imshow(“手工艺品”,手工艺品);
imshow(“手动检测”,fingerCountDebug);
如果(i==0)
{
背景清除器。校准(框架);
皮肤检测器。校准(框架);
}
}
等待键(0);
}
输出显示检测结果。然而,如果我修改代码,使帧不从视频流中读取,则输出完全不显示任何内容。有人能帮忙修理吗?编辑:由于一些社区成员的困惑,修改后的代码如下所示,显示在单个图像中:

#include "opencv2/opencv.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>

#include "BackgroundRemover.h"
#include "SkinDetector.h"
#include "FaceDetector.h"
#include "FingerCount.h"

using namespace cv;
using namespace std;

int main(int, char**) {

    string imageName("C:/Users/whoever/Desktop/hand_test.jpg"); // by default
    Mat image;
    image = imread(imageName.c_str(), IMREAD_COLOR); // Read the file


    Mat frame, frameOut, handMask, foreground, fingerCountDebug;

    BackgroundRemover backgroundRemover;
    SkinDetector skinDetector;
    FaceDetector faceDetector;
    FingerCount fingerCount;

    for (int i = 0; i < 2; i++)
    {
        frame = image;
        frameOut = frame.clone();

        skinDetector.drawSkinColorSampler(frameOut);

        foreground = backgroundRemover.getForeground(frame);

        faceDetector.removeFaces(frame, foreground);
        handMask = skinDetector.getSkinMask(foreground);
        fingerCountDebug = fingerCount.findFingersCount(handMask, frameOut);

        imshow("output", frameOut);
        imshow("foreground", foreground);
        imshow("handMask", handMask);
        imshow("handDetection", fingerCountDebug);

        if (i == 0)
        {
            cout << "Calibrating...";
            backgroundRemover.calibrate(frame);
            skinDetector.calibrate(frame);
        }
    }
    waitKey(0);
}
#包括“opencv2/opencv.hpp”
#包括“opencv2/imgcodecs.hpp”
#包括“opencv2/imgproc.hpp”
#包括“opencv2/videoio.hpp”
#包括
#包括
#包括“BackgroundRemover.h”
#包括“SkinDetector.h”
#包括“FaceDetector.h”
#包括“FingerCount.h”
使用名称空间cv;
使用名称空间std;
int main(int,char**){
字符串imageName(“C:/Users/where/Desktop/hand_test.jpg”);//默认值
Mat图像;
image=imread(imageName.c_str(),imread_COLOR);//读取文件
垫框,框出,手工,前景,手指调试;
背景清除剂背景清除剂;
皮肤检测器;
人脸检测器;
指数指数;
对于(int i=0;i<2;i++)
{
帧=图像;
frameOut=frame.clone();
皮肤检测器。drawSkinColorSampler(frameOut);
前台=backgroundRemover.getForeground(frame);
面检测器。移除面(帧、前景);
手工sk=skinDetector.getSkinMask(前景);
fingerCountDebug=fingerCount.FindFingerScont(手工任务,帧输出);
imshow(“输出”,帧输出);
imshow(“前景”,前景);
imshow(“手工艺品”,手工艺品);
imshow(“手动检测”,fingerCountDebug);
如果(i==0)
{

cout原始代码每次循环时处理从相机捕获的不同图像并输出差异。由于您现在每次都使用相同的图像,因此没有任何差异,因此输出完全为空。(请注意,它仍将以视频形式播放输出,只是一个持续空白的输出)

for循环中的第一行是它从相机获取新图像的位置:

   videoCapture >> frame;
正如您在更新的代码中所看到的,您正在删除此图像,并再次使用相同的图像:

    frame = image;
尝试保存两个不同的图像,并让程序在循环中每次加载一个不同的图像

下面是一种相当暴力的方法,您可以改进这种方法,以便在每次循环、使用数组等时加载不同的文件:

string imageName1("C:/Users/whoever/Desktop/hand_test_1.jpg"); // by default
string imageName2("C:/Users/whoever/Desktop/hand_test_2.jpg"); // by default
Mat image1;
Mat image2;
image1 = imread(imageName1.c_str(), IMREAD_COLOR); // Read the file
image2 = imread(imageName2.c_str(), IMREAD_COLOR); // Read the file

Mat frame, frameOut, handMask, foreground, fingerCountDebug;

BackgroundRemover backgroundRemover;
SkinDetector skinDetector;
FaceDetector faceDetector;
FingerCount fingerCount;

for (int i = 0; i < 2; i++)
{
    if (i = 0) { frame = image1 } else { frame = image2 };
...
stringimagename1(“C:/Users/where/Desktop/hand_test_1.jpg”);//默认情况下
字符串imageName2(“C:/Users/where/Desktop/hand_test_2.jpg”);//默认情况下
Mat图像1;
Mat图像2;
image1=imread(imageName1.c_str(),imread_COLOR);//读取文件
image2=imread(imageName2.c_str(),imread_COLOR);//读取文件
垫框,框出,手工,前景,手指调试;
背景清除剂背景清除剂;
皮肤检测器;
人脸检测器;
指数指数;
对于(int i=0;i<2;i++)
{
如果(i=0){frame=image1}否则{frame=image2};
...

调试此程序时,您发现了什么?在逐步执行时,您看到了什么?或者您希望我们(社区)为你这么做?对不起,我想我已经说得很清楚了。当我去掉VideoCapture对象并从文件中加载一个图像,并将该图像用作变量“frame”时,程序只加载了很多黑色图像。但是,使用“VideoCapture>>frame”行,程序的功能与预期一致。我看不到加载图像的任何代码rom一个文件。如果你只是注释
videoCapture>>帧
,你将得到一个空帧,这可能就是为什么你看到它是黑色的。尝试一个简单的程序,一个只读取文件并显示它的main(2行)从那里开始添加代码,直到你看到它没有做你想要的。谢谢,伙计。我是新来C++的,所以这个解释很好。谢谢你的帮助。
string imageName1("C:/Users/whoever/Desktop/hand_test_1.jpg"); // by default
string imageName2("C:/Users/whoever/Desktop/hand_test_2.jpg"); // by default
Mat image1;
Mat image2;
image1 = imread(imageName1.c_str(), IMREAD_COLOR); // Read the file
image2 = imread(imageName2.c_str(), IMREAD_COLOR); // Read the file

Mat frame, frameOut, handMask, foreground, fingerCountDebug;

BackgroundRemover backgroundRemover;
SkinDetector skinDetector;
FaceDetector faceDetector;
FingerCount fingerCount;

for (int i = 0; i < 2; i++)
{
    if (i = 0) { frame = image1 } else { frame = image2 };
...