opencv - 即使在彩色视频图像的情况下,nchannel() 也始终返回 1

标签 opencv

我正在用 Visual c++ 2008 express 编写一个 opencv 2.1 程序。我想获取每个像素的每个像素颜色数据并逐像素修改它们。

我了解代码“frmSource.channels();”返回 mat frmSource 的颜色 channel ,但即使是绝对彩色视频图像,它也始终返回 1,而不是 3 或 4。

我错了吗?

如果我错了,请指导我如何获取每个像素的每个颜色分量数据。

此外,“get(CV_CAP_PROP_FRAME_COUNT)”的总帧数比我预期的要大得多,所以我将“get(CV_CAP_PROP_FRAME_COUNT) 除以 get(CV_CAP_PROP_FPS Frame rate.”),我可以得到我预期的结果.

我知道帧就像电影的剪辑,每秒 30 帧。是对的吗?

我的编码如下:

void fEditMain()
{

VideoCapture vdoCap("C:/Users/Public/Videos/Sample Videos/WildlifeTest.wmv");

// this video file is provided in window7

if( !vdoCap.isOpened() ) 

{

    printf("failed to open!\n");

    return;

}

Mat frmSource;

vdoCap >> frmSource; 

if(! frmSource.data) return;


VideoWriter vdoRec(vRecFIleName, CV_FOURCC('W','M','V','1'), 30, frmSource.size(), true);

namedWindow("video",1);

// record video

int  vFrmCntNo=1;
for(;;)
{
    int vDepth = frmSource.depth();

    vChannel = frmSource.channels(); 

    // here! vChannel is always 1, i expect 3 or 4 because it is color image

    imshow("video", frmSource);// frmSource Show

    vdoRec << frmSource; 

    vdoCap >> frmSource;

    if(! frmSource.data) 

    return;
}        
return;
}

最佳答案

我不确定这是否会回答您的问题,但如果您使用 IplImage,则很容易获得正确数量的 channel 以及操纵图像。尝试使用:

IplImage *frm = cvQueryFrame(cap);
int numOfChannels = channelfrm->nChannels;

视频由帧组成,您可以使用 get(CV_CAP_PROP_FPS) 知道一秒钟通过多少帧。如果您将帧数除以 FPS,您将获得剪辑的秒数。

关于opencv - 即使在彩色视频图像的情况下,nchannel() 也始终返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8164432/

相关文章:

c++ - 如何将 Mat 复制到 ROI?

c++ - C++中的机器学习

image - 在 OpenCV 2 中将 8 位图像转换为 32 位图像

c++ - 指定给 RtlFreeHeap 的无效地址的原因是什么

c++ - 在我的测试程序中,为什么cv::resize 不能执行而cvtColor 可以?

performance - 在 opencv 中执行 alpha 掩码的最有效方法是什么?

image - 如果有 RGB 数据,如何处理 Gamma 校正

python - cv2.matchTemplate 函数与模板和图像不匹配后,如何阻止程序执行?

c++ - 使用 3x3 结构元素执行两次形态学扩张是否等于使用 6x6 结构元素执行一次?

c - 使用霍夫变换找直线,还需要跟踪在这些直线上找到的点