Я думаю, вы хотите найти координаты всех линий, которые у вас есть на изображении. Это очень легко найти координаты, следуя инструкции в C++:
- Пороговых бинарные Перевернутый
- Применить Thinning algorithm уменьшить толщину.
- Найдите ненулевые пиксели в двоичном изображении.
- Найти контуры & Применить Approx poly для приближения точек.
void thinningIteration(Mat& im, int iter)
{
Mat marker = Mat::zeros(im.size(), CV_8UC1);
for (int i = 1; i < im.rows-1; i++)
{
for (int j = 1; j < im.cols-1; j++)
{
uchar p2 = im.at<uchar>(i-1, j);
uchar p3 = im.at<uchar>(i-1, j+1);
uchar p4 = im.at<uchar>(i, j+1);
uchar p5 = im.at<uchar>(i+1, j+1);
uchar p6 = im.at<uchar>(i+1, j);
uchar p7 = im.at<uchar>(i+1, j-1);
uchar p8 = im.at<uchar>(i, j-1);
uchar p9 = im.at<uchar>(i-1, j-1);
int A = (p2 == 0 && p3 == 1) + (p3 == 0 && p4 == 1) +
(p4 == 0 && p5 == 1) + (p5 == 0 && p6 == 1) +
(p6 == 0 && p7 == 1) + (p7 == 0 && p8 == 1) +
(p8 == 0 && p9 == 1) + (p9 == 0 && p2 == 1);
int B = p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
int m1 = iter == 0 ? (p2 * p4 * p6) : (p2 * p4 * p8);
int m2 = iter == 0 ? (p4 * p6 * p8) : (p2 * p6 * p8);
if (A == 1 && (B >= 2 && B <= 6) && m1 == 0 && m2 == 0)
marker.at<uchar>(i,j) = 1;
}
}
im &= ~marker;
}
void thinning(Mat& im)
{
im /= 255;
Mat prev = Mat::zeros(im.size(), CV_8UC1);
Mat diff;
do
{
thinningIteration(im, 0);
thinningIteration(im, 1);
absdiff(im, prev, diff);
im.copyTo(prev);
}
while (countNonZero(diff) > 0);
im *= 255;
}
void main()
{
Mat mSource_Bgr,mSource_Gray,mThreshold,mThinning;
mSource_Bgr= imread(FileName_S.c_str(),IMREAD_COLOR);
mSource_Gray= imread(FileName_S.c_str(),0);
threshold(mSource_Gray,mThreshold,120,255,THRESH_BINARY_INV);
mThinning= mThreshold.clone();
thinning(mThinning);
imshow("mThinning",mThinning);
vector<Point2i> locations; // output, locations of non-zero pixels
findNonZero(mThinning, locations);
for (int i = 0; i < locations.size(); i++)
{
circle(mSource_Bgr,locations[i],2,Scalar(0,255,0),1);
}
imshow("mResult",mSource_Bgr);
//To Find the Lines from the image
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Find contours
findContours(mThinning.clone(), contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// Approximate contours to polygons + get bounding rects and circles
vector<vector<Point> > contours_poly(contours.size());
for(size_t i = 0; i < contours.size(); i++)
{
approxPolyDP(Mat(contours[i]), contours_poly[i], 2, true);
}
for (int i = 0; i < contours_poly.size(); i++)
{
drawContours(mSource_Bgr,contours_poly,i,Scalar(255,0,0),2);
}
imshow("mResult",mSource_Bgr);
}
Является ли это изображением того, что вам нужно обработать, или просто пояснительным эскизом? Это может иметь большое значение. –
Представитель. – user2562609
это задача компьютерного зрения, и в CV нет такой вещи, как простая. Вам нужно предоставить реальное входное изображение, чтобы мы увидели, что вы действительно имеете в виду. 2. Я начну с бинаризации изображения каким-либо способом (но если реальное изображение - это другой тип/шум/иллюминация, тогда это может быть не так) 3.Detect lines by hough transform или путем проверки/регрессии найденных пикселей соседей, соединяющих прямые линии. Этот процесс также называется векторизации, поэтому вы знаете, что искать , Это может быть значительно упрощено, если линии имеют ось/угол, а также постоянную известную ширину. – Spektre