OpenCV:为 HIT-MISS 创建方形结构元素
Posted
技术标签:
【中文标题】OpenCV:为 HIT-MISS 创建方形结构元素【英文标题】:OpenCV: create a square Structuring element for HIT-MISS 【发布时间】:2017-12-01 19:48:23 【问题描述】:我想要一个函数来创建一个“正方形内的正方形”结构元素,例如:
Mat explicit_kernel = (Mat_<int>(5, 5) <<
-1, -1, -1, -1, -1,
-1, 1, 1, 1, -1,
-1, 1, 1, 1, -1,
-1, 1, 1, 1, -1,
- 1, -1, -1, -1, -1);
所以我尝试制作一个丑陋的循环:
Mat generate_kernel(int size)
if (size % 2 == 0)
printf("Input %i, not even, replaced by %i\n", size, size + 1);
size++;
Mat out = Mat::ones(size + 2, size + 2, CV_8S);
for (int i = 0; i <= size + 1; i++)
for (int j = 0; j <= size + 1; j++)
if (i == 0 || i == size - 1)
out.at<int>(i, j) = -1;
else
if (j == 0 || j == size - 1)
out.at<int>(i, j) = -1;
//Mat out = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
return out;
但我遇到了“违规书写错误”,无论如何我正在寻找更简单的需求, 代码的主要目的是在循环内制作结构元素: - 大小为 1 的正方形,大小为 3 ... 谢谢:)
【问题讨论】:
这也是错误的:j <= size + j
.
谢谢,我修改为j
但是现在,生成矩阵只是充满了 -1 ,而不是更多的 1
【参考方案1】:
我找到了一个解决方案,考虑到 cv::Mat 是一个指针,并创建一个子矩阵
Mat generate_kernel(int size)
if (size % 2 == 0)
printf("Input %i, not even, replaced by %i\n", size, size + 1);
size++;
Mat out = -1 * Mat::ones(size + 2, size + 2, CV_8S);
Mat center = Mat(out, Rect(1, 1, size, size));
center = Mat::ones(size, size, CV_8S);
return out;
【讨论】:
【参考方案2】:这可能已经由cv::copyMakeBorder
方法处理。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat generate_kernel(int size, int outer_size=1)
if (size % 2 == 0)
printf("Input %i, not even, replaced by %i\n", size, size + 1);
size++;
Mat out = Mat::ones(size, size, CV_8S);
copyMakeBorder(out,
out,
outer_size, // top
outer_size, // bottom
outer_size, // left
outer_size, // right
BORDER_CONSTANT,
Scalar(-1.0));
return out;
int main(int argc, const char * argv[])
cout << "Size 1: " << generate_kernel(1) << endl;
cout << "Size 3: " << generate_kernel(3) << endl;
cout << "Size 5: " << generate_kernel(5) << endl;
return 0;
这会产生以下......
Size 1: [ -1, -1, -1;
-1, 1, -1;
-1, -1, -1]
Size 3: [ -1, -1, -1, -1, -1;
-1, 1, 1, 1, -1;
-1, 1, 1, 1, -1;
-1, 1, 1, 1, -1;
-1, -1, -1, -1, -1]
Size 5: [ -1, -1, -1, -1, -1, -1, -1;
-1, 1, 1, 1, 1, 1, -1;
-1, 1, 1, 1, 1, 1, -1;
-1, 1, 1, 1, 1, 1, -1;
-1, 1, 1, 1, 1, 1, -1;
-1, 1, 1, 1, 1, 1, -1;
-1, -1, -1, -1, -1, -1, -1]
【讨论】:
以上是关于OpenCV:为 HIT-MISS 创建方形结构元素的主要内容,如果未能解决你的问题,请参考以下文章
有没有像“cvHoughCircles()”这样的opencv函数来进行正方形检测?