Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Canny中检测并标记端点_C++_Opencv - Fatal编程技术网

C++ 从Canny中检测并标记端点

C++ 从Canny中检测并标记端点,c++,opencv,C++,Opencv,我想从canny edge map中查找并标记端点 我试着自己去做,只看一个邻居的点,但这一点的结果很奇怪 OpenCV中是否有查找端点的函数 来自原装Canny的样品: 放大的样本: 代码: int近邻; 对于(int i=1;i

我想从canny edge map中查找并标记端点

我试着自己去做,只看一个邻居的点,但这一点的结果很奇怪

OpenCV中是否有查找端点的函数

来自原装Canny的样品:

放大的样本:

代码:

int近邻;
对于(int i=1;i<(image.rows)-1;i++)
{
对于(int j=1;j<(image.cols)-1;j++)
{   
如果(图像在(i,j)==255)
{
邻居=0;

对于(int vx=i-1;vx,您只是在覆盖输入数据,但您的邻域计算采用原始值。因此,在您可能已经将邻域像素值更改为80之前,您会询问邻域是否具有值255

试试这个:

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);

}
intmain()
{
cv::Mat输入=cv::Mat::零(64,64,cv_8UC1);
cv::line(输入,cv::Point(15,15),cv::Point(50,50),cv::Scalar(255));
cv::line(输入,cv::Point(50,15),cv::Point(15,50),cv::Scalar(255));
cv::line(输入,cv::Point(15,25),cv::Point(25,15),cv::Scalar(255));
cv::line(输入,cv::Point(15,15),cv::Point(10,15),cv::Scalar(255));
cv::line(输入,cv::Point(15,15),cv::Point(15,10),cv::Scalar(255));
cv::Mat image=input.clone();
cv::Mat输出;
cv::cvtColor(输入、输出、cv_GRAY2BGR);
int邻居;
对于(int i=1;i<(image.rows)-1;i++)
{
对于(int j=1;j<(image.cols)-1;j++)
{
如果(图像在(i,j)!=0)
{
邻居=0;

对于(int vy=i-1;vy)是否确定白色像素为255?在代码前设置一个阈值以消除这种可能性。将单个像素更新为值80,然后询问它们是否为255。image.at(vx,vy)应为image.at(y,x)但这在这里没有问题,因为相同的范围和错误的内部循环顺序,所以事实上你应该将vx重命名为vy,将vy重命名为vx,如果你将all==255改为!=0,我想应该可以。
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);

}