C++下OpenCV中RGB通道的提取
Posted
技术标签:
【中文标题】C++下OpenCV中RGB通道的提取【英文标题】:Extracting RGB channels in OpenCV under C++ 【发布时间】:2015-07-08 14:23:08 【问题描述】:我正在使用 OpenCV 将使用 IDS uEye 相机捕获的图像数据转换为有用的格式,使用以下代码:
IplImage* tmpImg = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
tmpImg->imageData = pFrameBuffer[k];
frame = cv::cvarrToMat(tmpImg);
这非常有效 - 然后我可以在下游使用imwrite(filename,frame);
将处理后的图像以合理的格式写出。理想情况下,我希望能够将 RGB 通道保存为单独的“灰度”图像文件,但我不了解有关单通道操作的 OpenCV 文档。任何人都可以提出一种实现这一目标的方法吗?最好它不会在计算上过于昂贵(逐像素循环图像不是一种选择 - 我正在处理高达 1280x1064 的 60-230fps 视频,并且所有处理都必须在捕获点完成)。
运行最新的 Debian 测试如果这有什么不同(我认为不应该)。
【问题讨论】:
另外,停止使用 IplImage。改用 Mat 和 C++ 函数! 我不是一个庞大的 OpenCV 人 - 你能给我一个例子,说明如何在没有 IplImage 的情况下完成同样的任务吗? 类似Mat frame(Size(width, height), CV_8UC3, pData)
【参考方案1】:
一旦你有了一个cv::Mat
对象,就很简单了:
std::vector<cv::Mat> grayPlanes;
cv::split(frame, grayPlanes);
cv::imwrite("blue.png", grayPlanes[0]);
cv::imwrite("green.png", grayPlanes[1]);
cv::imwrite("red.png", grayPlanes[2]);
split 函数可以直接写入标准向量,你不必考虑内存管理和其他东西。
【讨论】:
以上是关于C++下OpenCV中RGB通道的提取的主要内容,如果未能解决你的问题,请参考以下文章