从Canny检测并标记端点

时间:2015-12-01 01:30:01

标签: c++ opencv

我想从canny边缘地图中找到并标记端点。

我试图通过查看只有一个邻居的点来自己做,但此时的结果很奇怪。

OpenCV中是否有一个函数可以找到端点?

来自原始Canny的样本:

放大样本:

代码:

int neighbors;
for(int i = 1; i < (image.rows)-1; i++)
{
    for(int j = 1; j < (image.cols)-1; j++)
    {   
        if( image.at<uchar>(i, j) == 255 )
        {
            neighbors = 0;
            for(int vx = i-1; vx <= i+1; vx++)
            {
                for(int vy = j-1; vy <= j+1; vy++)
                {
                    if(vx == i && vy == j)
                    {
                        continue;
                    }
                    else
                    {
                        if( image.at<uchar>(vx, vy) == 255 )
                        {
                            neighbors++;
                        }
                    }
                }
            }
            if(neighbors == 1)
            {
                image.at<uchar>(i, j) = 80;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您只是覆盖了您的输入数据,但您的邻居评估采用了原始值。因此,您可以询问邻居是否具有值255,但在您可能已将邻居像素值更改为80之前。

试试这个:

int main()
{
    cv::Mat input = cv::Mat::zeros(64,64,CV_8UC1);

    cv::line(input, cv::Point(15,15), cv::Point(50,50), cv::Scalar(255));
    cv::line(input, cv::Point(50,15), cv::Point(15,50), cv::Scalar(255));

    cv::line(input, cv::Point(15,25), cv::Point(25,15), cv::Scalar(255));

    cv::line(input, cv::Point(15,15), cv::Point(10,15), cv::Scalar(255));
    cv::line(input, cv::Point(15,15), cv::Point(15,10), cv::Scalar(255));


    cv::Mat image = input.clone();

    cv::Mat output;
    cv::cvtColor(input, output, CV_GRAY2BGR);

    int neighbors;

    for(int i = 1; i < (image.rows)-1; i++)
    {
        for(int j = 1; j < (image.cols)-1; j++)
        {

            if( image.at<uchar>(i, j) != 0 )
            {
                neighbors = 0;

                for(int vy = i-1; vy <= i+1; vy++)
                {
                    for(int vx = j-1; vx <= j+1; vx++)
                    {
                        if(vy == i && vx == j)
                        {
                            continue;
                        }
                        else
                        {
                            if( image.at<uchar>(vy, vx) != 0 )
                            {
                                neighbors++;
                            }
                        }
                    }
                }

                if(neighbors == 1)
                {
                    image.at<uchar>(i, j) = 80;
                    output.at<cv::Vec3b>(i, j) = cv::Vec3b(0,0,255);
                }
            }
        }
    }


    //cv::resize(image, image, cv::Size(1024, 1024), CV_INTER_NN);

    cv::imshow("input", input);
    cv::imshow("output", output);
    cv::waitKey(0);

}

生成此图像:

enter image description here

并输出此图像(标记为红色的终点):

enter image description here

这里调整了大小:

enter image description here

我还更改了vxvy的命名误导。