We唯有自己强大 2021-07-07 00:40 采纳率: 50%
浏览 209

遍历二值图获取每一列或者每一行的第一个像素值为255的点来拟合直线

img
二值图像

img
效果图

OPENCV的大神们,我最近在研究用直线拟合来抓取物体边缘的直线,首先将原图进行二值化,然后获取图像边缘轮廓,如果用霍夫直线检测好像不能很好的抓取到物体的边缘轮廓直线(因为边缘不是绝对的一条直线,都是一些线段。也可能因为我是小白,不知道怎样调节参数,不知道大家有没有什么好的方法能用霍夫直线检测抓取物体边缘直线。)于是我想到了用直线拟合的方式。但是用用直线拟合fitline()时要获取二值化后图像边缘像素值为255的所有第一个点(从上到下或者从右到左),我用双重循环遍历行和列,但是不知道怎样取出每行或者每列第一个像素值为255的点。所有求大神们帮下小弟。我是个小白,刚接触OPENCV。代码如下

int main()
{
Mat src = imread("E:\Project\img\1111.jpg");
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
/threshold(gray, gray, 100, 255, CV_THRESH_BINARY_INV);/
Canny(gray, gray, 80, 180);
imshow("二值图", gray);
/*vector lines;
HoughLinesP(gray, lines, 1, CV_PI / 180, 20,30);
for (int i = 0; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 255), 2, 8);
}
imshow("找直线效果图", src);*/
vector points;//此处我定义了一个向量容器存放所有从右往左第一个像素值为255的点
//下面用了双重循环从右往左,从上到下遍历所有行的第一个点,但是不知道怎样获取到第一个点。恳求大神帮忙,万分感谢。
for (int i = 0; i < src.rows; i++)
{
for (int j = src.cols; j > -1; j--)
{
if()
}
}

for (int i = 0; i < points.size(); i++)
{
    circle(src, points[i], 1, Scalar(0, 255, 0), 1, 8);
}
imshow("二维点集", src);

Vec4f line_lara;
fitLine(points,line_lara, DIST_L2, 0, 1e-2, 1e-2);
std::cout << "line_lara:" << line_lara << endl;

//获取点斜式的点和斜率
Point p;
p.x = line_lara[2];
p.y = line_lara[3];
double k = line_lara[1] / line_lara[0];

//计算直线的端点(y = k(x - x0) + y0)
Point pt1, pt2;
pt1.x = 0;
pt1.y = k * (0 - p.x) + p.y;
pt2.x = src.cols;
pt2.y = k * (src.cols - p.x) + p.y;

line(src, pt1, pt2, Scalar(0, 0, 255), 2, 8);

imshow("拟合直线", src);

waitKey(0);

}

  • 写回答

1条回答 默认 最新

  • 打酱油的工程师 单片机领域优质创作者 2023-01-06 10:26
    关注

    假设你想要遍历每一行,并在每一行中获取第一个像素值为255的点:
    首先,我们需要定义一个二维数组 image 存储二值图的像素值。
    然后,我们可以使用两个循环遍历整个图像。第一层循环遍历每一行,第二层循环遍历每一列。
    在第二层循环中,我们可以检查每一个像素值是否为 255。如果是,我们就可以记录这个像素的位置,然后退出循环。
    最后,我们就可以使用所有记录的像素位置来拟合直线。
    下面是一个例子:

    image = [[0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 255, 255, 255, 0, 0],
             [0, 0, 255, 255, 255, 0, 0],
             [0, 0, 255, 255, 255, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0]]
    
    # 定义空列表存储像素位置
    pixel_positions = []
    
    # 遍历每一行
    for i in range(len(image)):
        # 遍历每一列
        for j in range(len(image[i])):
            # 如果找到像素值为255的点,就记
    
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表