从视频流中获取像素数据

Posted

技术标签:

【中文标题】从视频流中获取像素数据【英文标题】:Grabbing Pixel data from a video strem 【发布时间】:2013-03-13 11:55:33 【问题描述】:

如果理解某些编码我会遇到麻烦我很抱歉如果这很愚蠢但我有一个代码可以从我的网络摄像头捕获视频我想从帧中获取 RGB 值如果这是不可能的将帧保存为图片,然后从中获取值?

const char window_name[]="网络摄像头";

int main(int argc, char* argv[])

/* attempt to capture from any connected device */
CvCapture *capture=cvCaptureFromCAM(CV_CAP_ANY);
if(!capture)

    printf("Failed to initialise webcam\n");
    return -1;


/* create the output window */
cvNamedWindow(window_name, CV_WINDOW_NORMAL);

do

    /* attempt to grab a frame */

    IplImage *frame=cvQueryFrame(capture);
    if(!frame)
    
        printf("Failed to get frame\n");
        break;
    


    COLORREF myColAbsolute = GetPixel(frame, 10,10);//error in saying frame is not compatible with HDC.

    cout << "Red - " << (int)GetRValue(myColAbsolute) << endl;
    cout << "Green - " << (int)GetGValue(myColAbsolute) << endl;
    cout << "Blue - " << (int)GetBValue(myColAbsolute) << endl;


    /* show the frame */
    cvShowImage(window_name, frame);

【问题讨论】:

我认为可能缺少一些代码,因为循环没有结束(我希望有一个右括号和一个 while 条件)。 【参考方案1】:

哈! (显然被复制和粘贴的无赖抓住了)

GetPixel() 是一个 windows 函数,而不是 opencv 函数。 GetRValue() 和姐妹们一样。

您可以在本机 win32 api 中使用它们从 HDC 获取像素,但它不适用于 opencv/highgui,因为 HDC 和 HWND 都没有暴露。

因为你显然是一个初学者(这没什么错,再说一遍!)让我试着说服你不要使用旧的 1.0 opencv api(IplImages, cv*Functions), 你应该改用新的(cv::Mat, namespace cv::Functions)。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;
using namespace std;

int main()

    Mat frame;
    namedWindow("video", 1);

    VideoCapture cap(0);
    while ( cap.isOpened() )
    
        cap >> frame;
        if(frame.empty()) break;

                int x=3, y=5;
                // Ladies and Gentlemen, the PIXEL!
                Vec3b pixel = frame.at<Vec3b>(y,x); // row,col, not x,y!
                cerr << "b:" << int(pixel[0]) << " g:" << int(pixel[1]) << " r:" << int(pixel[2]) << endl;

        imshow("video", frame);
        if(waitKey(30) >= 0) break;
       
    return 0;

【讨论】:

谢谢我最后真的用了这个方法,真的很有帮助谢谢:D

以上是关于从视频流中获取像素数据的主要内容,如果未能解决你的问题,请参考以下文章

OSX 上的 AVFoundation:来自视频的 OpenGL 纹理,无需访问像素数据

从视频文件中收集 RGB 数据

渲染出3D视频,单像素点实时渲染

渲染出3D视频,单像素点实时渲染

如何在scRGB色彩空间中从HDR视频中获取帧?

如何从视频中提取 ROI - 使不相关的像素变黑