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