OpenCV - 坚持解决锻炼问题

时间:2013-07-10 09:34:57

标签: c++ c opencv image-processing

任何人都可以告诉我如何创建一个滤镜来检测具有60度角的线条,如练习OpenCV练习书(点击here在线图书 - 请参阅第190页)中所述。我只是想知道过滤器将如何?或者是否有其他方式的检测线在60度?或者如何旋转60度的滤镜(不是图像)以检测线条?我更喜欢使用大型过滤器,如9 * 9或11 * 11或15 * 15等。

P.S。我知道如何检测标准角度的线条,如0,90等,但对其他角度感到困惑 - 如何在OpenCV中将滤镜旋转到不同的角色?

我在openCV中找到GetRotationMatrix2D来旋转矩阵,但我想它会旋转矩阵以形成一个2 * 3矩阵,并且还会旋转图像本身。我想知道我是否可以使用GetRotationMatrix2D在任何方向旋转9 * 9矩阵以获得9 * 9矩阵?此外,这可能不旋转图像本身吗?

2 个答案:

答案 0 :(得分:1)

如果您想手动创建过滤器并在cvFilter2d中使用,请查看angular filters。试着通过增加内核的大小来应用60度滤波器(高度应该接近root3倍宽度)并且对角写入“2”。

检查Hough transform and its tutorial。它输出所有线角度(根据x轴)。

同时查看SimpleCV

答案 1 :(得分:1)

定义垂直渐变滤镜(mFilter)后,如:

 1   1  1 .....1
 .
 1      
 0   0  0 .....0
-1
 .      
-1  -1 -1.....-1

(乘以1 / N ^ 2)

你可以这样做:

double angleDegree = 60;
Point2f mFilter_center(mFilter.cols/2.0F, mFilter.rows/2.0F);
Mat mRotation60= getRotationMatrix2D(mFilter_center, -angleDegree, 1.0);
Mat mFilter60;
warpAffine(mFilter, mFilter60, mRotation60, mFilter.size());

现在,您可以使用矩阵mFilter60作为60度边缘检测滤波器。但请注意,这是一个方向滤波器,您需要通过将mFilter60乘以-1来反转滤波器元素以获得剩余边。