我想从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;
}
}
}
}
答案 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);
}
生成此图像:
并输出此图像(标记为红色的终点):
这里调整了大小:
我还更改了vx
和vy
的命名误导。