二值图像
效果图
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);
}