Luk*_*792 5 c++ opencv image-processing flood-fill
我有以下图片:

我正在尝试创建一个循环,它将考虑每个像素的颜色,并从它找到的任何白点填充填充.
目前,我有这个代码:
for(int y=0; y<image.rows; y++)
{
for(int x=0; x<image.cols; x++)
{
image.at<cv::Vec3b>(y,x);
if(image.at<cv::Vec3b>(y,x)[0] == 255 && image.at<cv::Vec3b>(y,x)[1] == 255 && image.at<cv::Vec3b>(y,x)[2] == 255)
{
/*image.at<cv::Vec3b>(y,x)[0] = 155;
image.at<cv::Vec3b>(y,x)[1] = 0;
image.at<cv::Vec3b>(y,x)[2] = 0;*/
int filling = cv::floodFill(image, cv::Point(y,x), 255, (cv::Rect*)0, cv::Scalar(), 200);
//cout << "x:" << x << " y:" << y;
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它在每个像素上循环,如果它是白色的,它就会从那里溢出.我还在循环中留下了一些旧代码,这些代码重新处理每个像素并且工作,但是当我尝试填充我的图像时,它给我留下了类似这样的东西:

最终洪水填充图像超过4000次,这需要很长时间,甚至不会填满整个区域.
我做错了什么想法?或者有更好的方法吗?
你的问题是你总是从 (0, 0) 而不是从 (x, y) 处找到的白色像素进行洪水填充。另外,使用 at<>() 是一种非常慢的顺序扫描图像的方法。
更正的代码:
cv::Vec3b white(255, 255, 255);
for(int y=0; y<image.rows; y++)
{
cv::Vec3b* row = image.ptr<cv::Vec3b>(y)
for(int x=0; x<image.cols; x++)
{
if(row[x] == white)
{
cv::floodFill(image, cv::Point(x,y), cv::Scalar(255,0,0), (cv::Rect*)0, cv::Scalar(), cv::Scalar(200,200,200));
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2783 次 |
| 最近记录: |