【发布时间】:2012-02-21 04:59:19
【问题描述】:
我正在使用 QT 和 OpenCV,我需要提取这个正方形,但我需要使用从 RGB 到一个通道的转换(基本上是红色)。任何建议都将受到欢迎,请随时建议使用哪些功能。提前致谢。
【问题讨论】:
-
你想看看 cvtColor() 函数吗? opencv.willowgarage.com/documentation/cpp/…
我正在使用 QT 和 OpenCV,我需要提取这个正方形,但我需要使用从 RGB 到一个通道的转换(基本上是红色)。任何建议都将受到欢迎,请随时建议使用哪些功能。提前致谢。
【问题讨论】:
我认为 cvSplit 是您正在寻找的 (docs)。例如,您可以使用它来将 RGB 拆分为 R、G 和 B:
/* assuming src is your source image */
CvSize s = cvSize(src->width, src->height);
int d = src->depth;
IplImage* R = cvCreateImage(s, d, 1);
IplImage* G = cvCreateImage(s, d, 1);
IplImage* B = cvCreateImage(s, d, 1);
cvSplit(src, R, G, B, null);
请注意,您需要注意订购;确保原始图像实际上按 R、G、B 排序(很有可能是 B、G、R)。
【讨论】:
由于这被标记为qt,我将给出一个 C++ 答案。
// Create Windows
namedWindow("Red",1);
namedWindow("Green",1);
namedWindow("Blue",1);
// Create Matrices (make sure there is an image in input!)
Mat input;
Mat channel[3];
// The actual splitting.
split(input, channel);
// Display
imshow("Blue", channel[0]);
imshow("Green", channel[1]);
imshow("Red", channel[2]);
在 OpenCV 2.4.5 上测试
【讨论】:
另一种方法是使用extractChannel:
cv::Mat channel;
//image is already loaded
cv::extractChannel(image, channel, 2);
这将从image 中提取第三个通道并将结果保存在channel 中。也可以使用 extractImageCOI 和 mixChannels 提取特定频道。
【讨论】:
据我所知,
cvtColor(src, bwsrc, CV_RGB2GRAY);
可以这样做,其中src是多通道源图像,第三个参数表示目标中的通道数。因此,您可以在 OpenCV 中执行此操作并在 Qt 界面上显示图像。
另一方面,您可以使用适当的 split() 方法将通道拆分为单独的单通道数组。
http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#split
【讨论】: