gpt4 book ai didi

opencv - 如何在 opencv 中填充二值图像的边?

转载 作者:太空宇宙 更新时间:2023-11-03 22:14:05 24 4
gpt4 key购买 nike

我有一个二值图像。我想将其部分部分完全填充为黑色并保持白色。我想要的可以在这里得到最好的解释- http://www.roborealm.com/tutorial/Obstacle_Avoidance/slide020.php解释-我从右下角开始,然后到达左上角。如果我发现任何非黑色像素,所有 Y 坐标小于它且具有相同 X 坐标的像素都将变为黑色。这是通过从图像底部开始并逐个像素垂直填充每个空黑色像素直到非- 看到黑色像素。然后填充停止该垂直列并继续下一个。

我用opencv为它写了一段代码。我仅提及该特定部分的代码。

for (int j =dst.cols; j>=0; j--) {
for (int i =dst.rows; i>=0; i--) {
if (dst.at<char>(i,j) == 0){
dst.at<char>(i,j)=255;
}
if (dst.at<char>(i,j)>0){
for (int k =i; k>=0; k--) {
dst.at<char>(k,j)=0;
}
}
}
}

但它不工作。但它显示段错误(核心已转储)。

最佳答案

应该是:

for (int j =dst.cols-1; j>=0; j--) {
for (int i =dst.rows-1; i>=0; i--) {

UPD:我认为这应该更快:

#pragma once
#include <string>
#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
//----------------------------------------------------------
// MAIN
//----------------------------------------------------------
int main(int argc, char* argv[])
{
// src image
Mat src;
// dst image
Mat dst;
// Image loading
namedWindow("result");
namedWindow("src");
src=imread("d:\\ImagesForTest\\obstacle_scene_1_edge.jpg",0);
dst=Mat::zeros(src.size(),CV_8UC1);
for (int i=0;i<src.cols;++i)
{
int j=src.rows-1;
for (j=src.rows-1;j>0;--j)
{
if(src.at<uchar>(j,i)>0)
{
break;
}
}
dst(Range(j,dst.rows-1),Range(i,i+1))=255;
}
imshow("src",src);
imshow("result",dst);
//----------------------------------------------------------
// Wait key press
//----------------------------------------------------------
waitKey(0);
destroyAllWindows();
return 0;
}

关于opencv - 如何在 opencv 中填充二值图像的边?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606467/

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