【问题标题】:DirectX and OpenCVDirectX 和 OpenCV
【发布时间】:2010-10-19 15:23:36
【问题描述】:

所以我已经编写了一个程序,它从网络摄像头捕获图像,并将其放入一个名为 pBuffer 的向量中。 我可以轻松访问每个像素的 RGB 像素信息,只需

pBuffer[i]=R;pBuffer[i+1]=G;Buffer[i+2]=B.

这里没问题。

下一步现在是创建一个 IplImage* img,并用 pBuffer 的信息填充它...某种 SetPixel。

网上有一个SetPixel函数,就是:

(((uchar*)(image­>imageData + image­>widthStep*(y))))[x * image­>nChannels + channel] = (uchar)value;

其中值是 pBuffer 信息,x 和 y 是像素坐标。但是我根本无法使用它。有任何想法吗??我正在使用 C++。

【问题讨论】:

    标签: image-processing opencv iplimage


    【解决方案1】:

    您可以这样做(假设宽度和高度是图像尺寸):

    CvSize size;
    size.height = height;
    size.width = width;
    IplImage* ipl_image_p = cvCreateImage(size, IPL_DEPTH_8U, 3);
    
    for (int y = 0; y < height; ++y)
        for (int x = 0; x < width; ++x)
            for (int channel = 0; channel < 3; ++channel)
                *(ipl_image_p->imageData + ipl_image_p->widthStep * y + x * ipl_image_p->nChannels + channel) = pBuffer[x*y*3+channel];
    

    但是,您不必复制数据。您还可以通过 IplImage 使用您的图像数据(假设 pBuffer 是 char* 类型,否则您可能需要转换它):

    CvSize size;
    size.height = height ;
    size.width = width;
    IplImage* ipl_image_p = cvCreateImageHeader(size, IPL_DEPTH_8U, 3);
    ipl_image_p->imageData = pBuffer;
    ipl_image_p->imageDataOrigin = ipl_image_p->imageData;
    

    【讨论】:

    • pBuffer 中的数据是 BYTE 但我可以将它作为 int 访问
    • BYTE 是 unsigned char 的 typedef,因此您可以安全地将其转换为 char。所以代码就变成了:ipl_image_p->imageData = (char*)pBuffer;
    • 伙计,它起作用了...但是在 IplImage 中创建的图像是颠倒的...知道为什么吗?
    • 我不确定。但是您可以尝试更改 ipl_image_p->origin。它应该是 0 或 1。两者都试一下,看看会发生什么。
    • 尽管如此 tks 很多...我正在写我的主 thesys,而这个 sh** 已经困扰了我一段时间了。顺便说一句,你在哪里学习 OpenCV 和 IplImage?通过什么书?
    猜你喜欢
    • 2019-09-24
    • 2010-12-27
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多