cv::copyMakeBorder设置填充类型无效
时间: 2023-08-13 09:08:44 浏览: 104
您好!对于cv::copyMakeBorder函数,设置填充类型无效可能有几个原因。首先,请确保您正确设置了填充类型参数。填充类型参数应该是一个整数值,可以是cv::BORDER_CONSTANT、cv::BORDER_REPLICATE、cv::BORDER_REFLECT等之一。
其次,请检查是否正确设置了边界填充的尺寸。填充尺寸应该是一个cv::Size对象,包含了水平和垂直方向上的填充像素数目。
最后,请确保您正确传递了输入图像和输出图像参数。输入图像应该是一个cv::Mat对象,而输出图像则是一个已经分配了内存空间的cv::Mat对象。
如果您仍然遇到问题,请提供更多的详细信息,例如代码片段或者错误信息,以便我能更好地帮助您解决问题。
相关问题
cv::copyMakeBorder用法
cv::copyMakeBorder函数可以在图像的边缘添加边框。它有几个参数,具体如下:
```cpp
cv::copyMakeBorder(src, dst, top, bottom, left, right, borderType, value);
```
其中:
- src:输入图像
- dst:输出图像
- top、bottom、left、right:分别表示在上、下、左、右四个方向上要添加的边框像素数
- borderType:表示边框的类型,有以下几种选择:
- cv::BORDER_CONSTANT:添加常数边框,此时需要额外提供value参数,表示边框的像素值。
- cv::BORDER_REPLICATE:复制边缘像素,即将图像沿边缘的像素进行复制,直到边框像素数为止。
- cv::BORDER_REFLECT:对称复制边缘像素,即将图像沿边缘的像素进行对称复制,直到边框像素数为止。
- cv::BORDER_WRAP:环绕式边框,即将图像沿边缘的像素进行循环复制,直到边框像素数为止。
- cv::BORDER_REFLECT_101:对称复制边缘像素,但是第一个像素和最后一个像素不进行复制。
- cv::BORDER_TRANSPARENT:添加透明边框,此时需要使用alpha通道来控制透明度。
- value:当边框类型为BORDER_CONSTANT时,使用此参数指定边框像素值。
下面是一个简单的示例代码:
```cpp
cv::Mat src = cv::imread("input.jpg");
cv::Mat dst;
int top = 30, bottom = 30, left = 50, right = 50;
cv::copyMakeBorder(src, dst, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 255));
cv::imshow("Input", src);
cv::imshow("Output", dst);
cv::waitKey(0);
```
这段代码将在输入图像的上下左右四个方向分别添加30和50个像素的蓝色边框。
纯c++实现opencv的cv::copyMakeBorder
cv::copyMakeBorder函数是OpenCV中的一个函数,用于在图像的边缘添加边框。纯C++实现该函数需要以下步骤:
1. 定义一个新的图像,大小为原图像加上上、下、左、右四个方向的边框大小。
2. 将原图像复制到新图像中间的部分。
3. 对于上、下、左、右四个边框,分别使用cv::copyTo函数将原图像的一部分复制到新图像的对应位置。
以下是一个简单的实现示例:
```cpp
void copyMakeBorder(const cv::Mat& src, cv::Mat& dst, int top, int bottom, int left, int right, int borderType, const cv::Scalar& value)
{
int srcRows = src.rows;
int srcCols = src.cols;
int dstRows = srcRows + top + bottom;
int dstCols = srcCols + left + right;
dst.create(dstRows, dstCols, src.type());
// 复制原图像到新图像中间
src.copyTo(dst(cv::Rect(left, top, srcCols, srcRows)));
// 添加上下左右四个边框
if (top > 0) {
cv::Mat roi = dst(cv::Rect(0, 0, dstCols, top));
cv::Mat srcRoi = src(cv::Rect(0, 0, srcCols, top));
cv::copyTo(srcRoi, roi);
}
if (bottom > 0) {
cv::Mat roi = dst(cv::Rect(0, dstRows - bottom, dstCols, bottom));
cv::Mat srcRoi = src(cv::Rect(0, srcRows - bottom, srcCols, bottom));
cv::copyTo(srcRoi, roi);
}
if (left > 0) {
cv::Mat roi = dst(cv::Rect(0, 0, left, dstRows));
cv::Mat srcRoi = src(cv::Rect(0, 0, left, srcRows));
cv::copyTo(srcRoi, roi);
}
if (right > 0) {
cv::Mat roi = dst(cv::Rect(dstCols - right, 0, right, dstRows));
cv::Mat srcRoi = src(cv::Rect(srcCols - right, 0, right, srcRows));
cv::copyTo(srcRoi, roi);
}
}
```
其中,参数说明如下:
- src:原图像
- dst:目标图像,将原图像加上边框后的结果
- top、bottom、left、right:上、下、左、右四个方向的边框大小
- borderType:边框类型,可以选择BORDER_CONSTANT、BORDER_REPLICATE等
- value:当使用BORDER_CONSTANT边框类型时,填充的颜色值
阅读全文