Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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++ OpenCV中的侵蚀_C++_Image_Image Processing_Opencv - Fatal编程技术网

C++ OpenCV中的侵蚀

C++ OpenCV中的侵蚀,c++,image,image-processing,opencv,C++,Image,Image Processing,Opencv,我正在尝试使用OpenCV执行图像腐蚀。我想这样做:假设我有四个不同的元素 S1 = [ 0 1 0, 0 1 0, 0 1 0 ] S2 = [ 0 0 0, 1 1 1, 0 0 0 ] S3 = [ 0 0 1, 0 1 0, 1 0 0 ] S4 = [ 0 1 0, 1 1 1, 0 1 0 ] 我想用这些元素对原始图像进行四种不同的腐蚀: E1 = I & S1 E2 = I & S2 E3 = I & S3 E4 = I & S4 其中“I”

我正在尝试使用OpenCV执行图像腐蚀。我想这样做:假设我有四个不同的元素

S1 = [ 0 1 0, 0 1 0, 0 1 0 ]
S2 = [ 0 0 0, 1 1 1, 0 0 0 ]
S3 = [ 0 0 1, 0 1 0, 1 0 0 ]
S4 = [ 0 1 0, 1 1 1, 0 1 0 ]
我想用这些元素对原始图像进行四种不同的腐蚀:

E1 = I & S1 
E2 = I & S2 
E3 = I & S3
E4 = I & S4
其中“I”是原始图像,为了简单起见,我用“&”表示侵蚀。然后我想通过加上这四个,得到最终侵蚀:

E = E1 + E2 + E3 + E4
但是当用opencv实现这些时,我在早期阶段遇到了困难。我声明了如下元素:

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
int S2[3][3] = { { 0, 0, 0 }, { 1, 1, 1 }, { 0, 0, 0 } };
int S3[3][3] = { { 0, 0, 1 }, { 0, 1, 0 }, { 1, 0, 0 } }; 
int S4[3][3] = { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } };

然后,对于使用“cv::腐蚀”,我很难使用这些元素,因为它们不是可接受的类型。我如何使用这些元素来获得上述所需的侵蚀?先谢谢你

您可能需要从所需的内核形状创建一个
cv::Mat
,这些被称为结构元素,OpenCV提供了创建一些常见形状的功能

或者,您可以通过直接使用以下内容从数据创建新矩阵来形成自己的矩阵:

cv::Mat S1 = (cv::Mat_<uchar>(3,3) << 0, 1, 0, 0, 1, 0, 0, 1, 0);

您可能需要从所需的内核形状创建一个
cv::Mat
,这些被称为结构元素,OpenCV提供了创建一些常见形状的功能

或者,您可以通过直接使用以下内容从数据创建新矩阵来形成自己的矩阵:

cv::Mat S1 = (cv::Mat_<uchar>(3,3) << 0, 1, 0, 0, 1, 0, 0, 1, 0);
使用-object作为内核。和(参见文档)在大多数情况下可以是Mats或std::vector对象

我认为您可以这样初始化它(未经测试):

使用-object作为内核。和(参见文档)在大多数情况下可以是Mats或std::vector对象

我认为您可以这样初始化它(未经测试):


谢谢你的回答。我按照你的建议做了,它给出了一个错误,说“未知函数中的Assersion failed(_kernel.type()==CV_8U)”。啊哈,我错过了它。现在它成功了,再次感谢你的回答。谢谢你的回答。我按照你的建议做了,它给出了一个错误,说“未知函数中的Assersion failed(_kernel.type()==CV_8U)”。啊哈,我错过了它。现在它可以工作了,再次感谢你的回答。我已经测试了它,它给出了一个错误,我认为类型“int”是问题所在。我会找人修的。也谢谢你的回答。我已经测试过了,它给出了一个错误,我认为类型“int”是问题所在。我会找人修的。也谢谢你的回答。
cv::Mat E = E1 + E2 + E3 + E4;
int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
Mat mat1 = Mat(3, 3, CV_32SC1, S1);