gpt4 book ai didi

opencv - 在特定位置从 cv::Mat 中查找像素颜色

转载 作者:太空宇宙 更新时间:2023-11-03 21:57:08 25 4
gpt4 key购买 nike

我的问题是,我需要找到包含所有白色像素的 cv::Mat 图像的子矩阵。因此我想遍历所有像素,检查它们是否为白色并使用该信息构建一个 cv::Rect。
我想出了如何遍历所有像素,但我不知道如何从中获取像素颜色。 cv::Mat 之前使用 CV_GRAY2BGR

转换为灰度
for(int y = 0; y < outputFrame.rows; y++)
{
for(int x = 0; x < outputFrame.cols; x++)
{
// I don't know which datatype I should use
if (outputFrame.at<INSERT_DATATYPE_HERE>(x,y) == 255)
//define area
}
}

我的最后一个问题是,我应该在 INSERT_DATATYPE_HERE 位置的代码中插入哪种数据类型,并且 255 是否适合与 than 进行比较?

非常感谢

最佳答案

这取决于您图片的 channel 。 Mat有方法 channels。它返回 channel 数 - 如果图像是灰色,它是一个,如果图像是彩色的,它是三个(例如,RGB - 每个颜色分量一个 channel )。

所以你必须做这样的事情:

if (outputFrame.channels() == 1) //image is grayscale - so you can use uchar (1 byte) for each pixel
{
//...
if (outputFrame.at<uchar>(x,y) == 255)
{
//do a check if this pixel is the most left, or the most right, or the most top, or the most bottom (this is needed to construct result rectangle)
}
}
else
if (outputFrame.channels() == 3) //image is color, so type of each pixel if Vec3b
{
//...
// white color is when all values (R, G and B) are 255
if (outputFrame.at<Vec3b>(x,y)[0] == 255 && outputFrame.at<Vec3b>(x,y)[1] == 255 && outputFrame.at<Vec3b>(x,y)[2] == 255)
{
//do a check if this pixel is the most left, or the most right, or the most top, or the most bottom (this is needed to construct result rectangle)
}
}

但实际上要获得包含图像上所有白色像素的矩形,您可以使用另一种技术:

  1. Convert image to grayscale .
  2. 做一个threshold将值 254(或接近 255)作为参数。
  3. Find all contours on image .
  4. 构造一个包含所有这些轮廓的轮廓(简单地将每个轮廓的所有点添加到一个大轮廓中)。
  5. 使用bounding rectangle function找到您需要的矩形。

关于opencv - 在特定位置从 cv::Mat 中查找像素颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12172043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com