【问题标题】:OpenCV load image/video from stdinOpenCV 从标准输入加载图像/视频
【发布时间】:2014-10-07 17:35:57
【问题描述】:

我正在尝试使用以下代码从标准输入读取 jpg 图像:

int c,count=0;
vector<uchar> buffer; //buffer for coding

/* for stdin, we need to read in the entire stream until EOF */
while ((c = fgetc(stdin)) != EOF) {
     buffer.push_back(c);
 count++;
}


cout << "Bytes: " << count << endl;
Mat im = imdecode(Mat(buffer),CV_LOAD_IMAGE_COLOR);
cout << "Decoded\n";
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image",im);

cv::waitKey(0);

我在 cmd 中运行这个:

OpenCVTest < thumb.jpg

这是我得到的:

Bytes: 335
Decoded
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in unknown function, file ..\..\..\src\opencv\modules\core\src\array.cpp, line 2482

这个错误似乎是合理的,因为图像大约 7 KB,但根据计数器只读取了 335 个字节。

我做错了什么?

我的最终目标是逐帧从标准输入读取视频。这可能吗?

非常感谢!

【问题讨论】:

    标签: opencv


    【解决方案1】:

    以下从标准输入逐帧读取 jpeg 序列。例子:

    ffmpeg

    ffmpeg -i input.mp4 -vcodec mjpeg -f image2pipe -pix_fmt yuvj420p -r 10 -|program.exe
    

    门编码器

    mencoder input.mp4 -nosound -ovc lavc -lavcopts vcodec=mjpeg -o -|program.exe
    

    卷曲

    curl "http://10.10.201.241/mjpeg/video.cgi&resolution=320x240"|program.exe
    

    代码

    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    using namespace cv;
    
    #if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
        || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__)
    # include <io.h>
    # include <fcntl.h>
    # define SET_BINARY_MODE(handle) setmode(handle, O_BINARY)
    #else
    # define SET_BINARY_MODE(handle) ((void)0)
    #endif
    
    #define BUFSIZE 10240
    int main ( int argc, char **argv )
    {
    
        SET_BINARY_MODE(fileno(stdin));
        std::vector<char> data;
        bool skip=true;
        bool imgready=false;
        bool ff=false;
        int readbytes=-1;
        while (1)
        {   
            char ca[BUFSIZE];
            uchar c;
            if (readbytes!=0)
            {
                readbytes=read(fileno(stdin),ca,BUFSIZE);
                for(int i=0;i<readbytes;i++)
                {
                    c=ca[i];
                    if(ff && c==(uchar)0xd8)
                    {
                        skip=false;
                        data.push_back((uchar)0xff);
                    }
                    if(ff && c==0xd9)
                    {
                        imgready=true;
                        data.push_back((uchar)0xd9);
                        skip=true;
                    }
                    ff=c==0xff;
                    if(!skip)
                    {
                        data.push_back(c);
                    }
                    if(imgready)
                    {
                        if(data.size()!=0)
                        {
                            cv::Mat data_mat(data);
                            cv::Mat frame(imdecode(data_mat,1));
    
                            imshow("frame",frame);
                            waitKey(1);
                        }else
                        {
                            printf("warning");
                        }
                        imgready=false;
                        skip=true;
                        data.clear();
                    }
                }
            }
            else
            {
                throw std::string("zero byte read");
            }
        }
    }    
    

    【讨论】:

    • 非常感谢Zaw Lin!我已经为此苦苦挣扎太久了!您提到这将适用于 mencoder。你能告诉我怎么做吗?是否有 image2pipe 等价物?再次感谢!!!
    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 2022-06-10
    • 2020-05-11
    • 2020-12-24
    • 2018-03-01
    • 2018-10-28
    • 2017-03-31
    • 2018-01-25
    相关资源
    最近更新 更多