首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何擦除或消失cv::Mat矩阵或图像中的黑色边框

在OpenCV中,可以使用cv::copyMakeBorder函数来添加边框,而要擦除或消失cv::Mat矩阵或图像中的黑色边框,可以通过以下步骤实现:

  1. 首先,使用cv::copyMakeBorder函数添加一个比原始图像边框更大的边框,确保边框完全包含在新的边框内部。边框的大小可以根据需求进行调整。
  2. 接下来,使用cv::bitwise_not函数对添加了边框的图像进行反转,将黑色变为白色,白色变为黑色。
  3. 然后,使用cv::floodFill函数从图像的四个角开始,将边框区域内的所有像素填充为白色。可以设置填充的起始点和填充的颜色。
  4. 最后,使用cv::bitwise_not函数再次对图像进行反转,将白色变为黑色,黑色变为白色,以恢复原始图像的颜色。

以下是一个示例代码:

代码语言:txt
复制
cv::Mat eraseBlackBorder(cv::Mat image) {
    int borderSize = 10; // 设置边框大小
    cv::Mat borderedImage;
    cv::copyMakeBorder(image, borderedImage, borderSize, borderSize, borderSize, borderSize, cv::BORDER_CONSTANT, cv::Scalar(0));

    cv::bitwise_not(borderedImage, borderedImage);

    cv::floodFill(borderedImage, cv::Point(0, 0), cv::Scalar(255));
    cv::floodFill(borderedImage, cv::Point(borderedImage.cols - 1, 0), cv::Scalar(255));
    cv::floodFill(borderedImage, cv::Point(0, borderedImage.rows - 1), cv::Scalar(255));
    cv::floodFill(borderedImage, cv::Point(borderedImage.cols - 1, borderedImage.rows - 1), cv::Scalar(255));

    cv::bitwise_not(borderedImage, borderedImage);

    cv::Rect roi(borderSize, borderSize, image.cols, image.rows);
    cv::Mat result = borderedImage(roi);

    return result;
}

这个函数接受一个cv::Mat类型的图像作为输入,并返回擦除了黑色边框的图像。你可以将你的图像传递给这个函数,它将返回一个没有黑色边框的图像。

注意:这个示例代码仅适用于擦除黑色边框,如果边框颜色不是黑色,需要相应地调整代码中的颜色值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS-OpenCV之蔡徐坤教你玩转边框画

这篇文章的整体思路来源于 知乎 的 Maker毕 的文章: 蔡徐坤教你用OpenCV实现素描效果 上一篇文章中我们已经讲述过了,图像的存储,以及一些相关的信息。...cv::Mat gray; // 将图像转换为灰度显示 cv::cvtColor(cvImage, gray, CV_RGB2GRAY); cvImage.release();...对灰度图片进行高斯模糊 首先,先来讲一下如何进行简单的 模糊 处理 在上一篇文章中我们已经讲过了,图片其实就是一个二维数组。 所以图片上的每一个像素,都有一个像素数值。...*3的核 cv::Mat ken = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); /// 进行图像的开运算(开运算需要对有数值的地方进行缩小...最后进行一次高斯模糊 我们最后在进行一次高斯模糊,使我们的图像效果更好。 其他 视频的转换,这里就不多写了(正在研究过程中...)

1.8K30

使用计算机视觉实战项目精通 OpenCV:1~5

可能有多个cv::Mat对象(或标头)引用相同的数据,甚至可能有一个cv::Mat 对象引用另一个cv::Mat图像的子区域。...因此,与其分配两个单独的图像并复制边缘遮罩像素,不如分配一个包含边框的单个遮罩图像,并创建一个W x H的额外cv::Mat标头(它只是引用了洪水填充遮罩中没有边界的兴趣区域)。...我们将扫描图像中的黑色像素,并在每个黑色像素处检查其周围5 x 5正方形的边框,以查看所有5 x 5边框像素是否均为白色。...如果它们都是白色,我们知道我们有一个黑色的小岛,因此我们用白色像素填充整个块,以消除黑色岛。 为了简单起见,在我们的5 x 5过滤器中,我们将忽略图像周围的两个边框像素,并保持原样。...标记分为7 x 7的网格,内部7 x 7的单元格包含 ID 信息。 其余部分对应于外部黑色边框。 在这里,我们首先检查外部黑色边框是否存在。

2.3K10
  • 独家|OpenCV 1.4 对图像的操作

    将图像保存为一个文件: 注 文件的格式由其扩展名确定。 用CV :: imdecode和CV :: imencode从内存中读取和写入图像。...函数,可以将 2D或3D像素点值转换成Mat形式的矩阵。...利用std::vector可以很容易地构建出这样的矩阵(仅适用于C ++): 利用相同的方法Mat::at可以访问矩阵中的点(仅适用于C ++): 内存管理和引用计数 Mat是保持矩阵/图像特性的一种结构...如果需要复制数据的话,则使用cv::Mat::copyTo或者 cv::Mat::clone两个函数: 应为上述每个函数提供一个空的Mat输出,每一次实现均是对目标矩阵调用一次Mat::create。...例如,下面是如何从现有的灰度图像中提取出黑色图像IMG 选择感兴趣的区域: 将彩色图像转换成灰度图像: 将图像类型从8UC1变为 32FC1: 可视化图像 在算法开发过程中,如果能看到运行的中间结果是非常有用的

    89120

    独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

    在这些情况中,虽然我们肉眼看到的是图像,但是当需要将图像在数字设备中变换传输时,图像的每个像素则对应一个数值。 例如,上述图像你可以看到一个汽车的后视镜,它可以用包含像素点强度值的矩阵来表示。...对象头; 图像的基本矩阵可以利用cv::Mat::clone() 和cv::Mat::copyTo()两个函数进行复制。...但是,增加组件数据类型长度的同时也会增加整个图片占用的内存大小。 创建Mat对象 在调用、修改和保存图像教程中,你已经学会了如何利用cv::imwrite()函数 将矩阵写入图像文件之中。...如果需要创建更多的图像矩阵,还可以利用宏来创建,按照下述方式,设置括号中的通道数目: 构造C / C ++数组,并对其进行初始化 上述例子说明了如何创建一个维数大于2维的矩阵。...指定矩阵大小和数据类型: 对于比较小的矩阵,可以使用逗号分隔初始化值或初始化值列表(支持C++ 11): 为现有的Mat对象创建一个新的Mat对象头:cv::Mat::clone or cv::Mat

    74350

    OpenCV 学习日记(三)--- 常见数据类型

    opencv中的几种常见的图像类型: CvArr :  老版本的结构了。...Mat(cv::Mat,当写了using namespace cv时,就直接用Mat): 新版本中的强大的一个图像容器,是和Matlab中的函数对应的。...基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。...矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。...CvMat 和cv::Mat之间的区别: cv::Mat是一个类(Class),而CvMat是一个Struct,从类型上就可以知道二者存在很大区别。

    97700

    C#使用OpenCV进行答题卡识别

    , ColorConversionCodes.GRAY2RGB); 复制 Mat img2 = new Mat(); img1.CopyTo(img2); 图片拼接 type表示了矩阵中元素的类型以及矩阵的通道个数...方式2(不推荐) 使用VConcat()或HConcat()拼接则要求待拼接图像有相同的宽度或高度 /// /// Mat拼接 /// /// <param name...); return resultMat; } 腐蚀与膨胀 腐蚀与膨胀都是针对白色区域的 腐蚀 白色变少 黑色变多 膨胀 白色变多 黑色减少 示例 /// /// 膨胀 /// 矩阵中,转置就是把行与列相互调换位置; 相当于将图像逆时针旋转90度,然后再关于x轴对称 枚举 public enum FlipMode { // // 摘要: // means...Scalar(0, 0, 255), 1); Cv2.ImWrite("D:\\Pic\\10_边框.png", img10); 注意 黑白图片转为彩色 查找轮廓 实现框选用户选择的选项 /// <summary

    2.8K61

    ArUco的生成与检测

    这里举个例子 cv::Mat markerImage; cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv...最后一个参数是一个可选的参数,用于指定标记黑色边框的宽度,指定的大小与位数成比例,例如,当值为2意味着边框的宽度将相当于两个内部位的大小,默认值位1。...每个检测到的标记包括: 1,它的四个角在图像中的位置(按其原始顺序)。 2,标记的id。 标记检测过程由两个主要步骤组成: 1,候选标记的检测。...在这一步中,对图像进行分析,以便找到作为候选标记的正方形。该算法首先对图像进行自适应阈值分割,然后从分割后的图像中提取轮廓线,剔除不凸或不近似正方形的轮廓线。...根据标记大小和边框大小将图像划分为不同的单元,并且计算每个单元上的黑色或白色像素的数量以确定它是白色还是黑色位。最后,对位进行分析以确定标记是否属于特定字典,并在必要时采用纠错技术。

    3.2K20

    【从零学习OpenCV 4】图像距离变换

    图像中两个像素之间的距离有多种定义方式,图像处理中常用的距离有欧式距离、街区距离和棋盘距离,本节中将重点介绍这三种距离的定义方式,以及如何利用两个像素间的距离来描述一幅图像。...由于distanceTransform()函数是计算图像中非0像素距离0像素的最小距离,而图像中0像素表示黑色,因此为了保证能够清楚的观察到距离变换的结果,不建议使用尺寸过小或者黑色区域较多的图像,否则...distanceTransform()函数处理后的图像中几乎全为黑色,不利于观察。...由于riceBW图像黑色区域较多,如果距离变换结果的数据类型为CV_8U,那么查看图像时将全部为黑色,因此将距离变换结果的数据类型设置为CV_32F,所以查看图像时与原二值图像一致,但是内部的数据不一致...cv; using namespace std; int main() { //构建建议矩阵,用于求取像素之间的距离 Mat a = (Mat_(5, 5) << 1, 1, 1,

    1.3K20

    泊车必备 | 一文详解AVM环视自标定

    ,例如下图(引用自一文详解四元数、欧拉角、旋转矩阵、轴角如何相互转换 (qq.com)): 飞机坐标系 当然,我们只讨论相机坐标系的情况,别的不考虑。...eigen可以进行特征分解,特征值大小从大到小排列,特征向量是一行一行写入opencv的mat中的,即mat矩阵的第三行为解,拿到第三行向量做归一化即可。...4.4 基于消失点标定外参 基于消失点标定外参的方法是通过相机模型推导的,式中 (X,Y,Z,1)为道路坐标系下某一点的齐次坐标,通过外参 (R,t)转换到相机坐标系,然后通过相机内参 K 转移到图像坐标系下...因此我们可以通过上述相机模型+消失点二维图像坐标+消失点三维坐标的Z为无穷大这些先验构建起约束关系,推导如下: 那么问题来了,我们得到了旋转矩阵的最后一列 r 有什么用呢?...实际上roll、yaw、pitch的六种组合式中,每一种组合式的结果 R 必然有一列是非常简洁的,而在4.3节中我们根据消失点深度Z是无穷的+消失点图像坐标+相机内参这三个先验信息可以计算出 R 矩阵中第三列向量

    3.1K50

    opencv中scalar_opencv ffmpeg

    大家好,又见面了,我是你们的朋友全栈君。 Mat类中的Scalar()成员有什么用呢?...(); imwrite(“图像.jpg”,rawImg); return 0; } 最后结果为:黑色 再设为scalar(255),结果:白色 没有设置边框,可以确定是全白的 再设为150...看看彩色图像吧 将程序做修改如下: Mat rawImg(600, 500, CV_8UC3, Scalar(255, 0, 0)); 然后运行,结果: 然后逐步将参数分别设为0,255,0,结果...明白了 //各参数依次是:照片/添加的文字/左上角坐标/字体/字体大小/颜色/字体粗细 Scalar(255, 255, 255)是白色字体 Scalar(0,0, 0)是黑色字体 顺序b g r cv.color...在Opencv中,cvScalar是CV_RGB的宏,cvScalar的储存顺序是B-G-R,而CV_RGB的储存顺序是R-G-B,两者正好相反,所以你的cvScalar(255,0,0),实际意思是B

    44120

    增强现实入门实战,使用ArUco标记实现增强现实

    它是一个背景为黑色的正方形,正方形内部的白色图案用来表示标记的唯一性,并且存储一些信息。黑色边界的目的是为了提高ArUco标记检测的准确性和性能。...每个词典中所有的Aruco标记均包含相同数量的块或位(例如4×4、5×5、6×6或7×7),且每个词典中Aruco标记的数量固定(例如50、100、250或1000)。...OpenCV在其文档中详细描述了姿势估计过程。 本文中,我们将把ArUco标记用于增强现实应用程序,该程序可以将任何新场景叠加到现有图像或视频上。...图像的替换过程我们可以通过如下代码实现: C++代码 // Compute homography from source and destination points Mat h = cv::findHomography...使用OpenCV中的findHomography函数计算源点和目标点之间的单应性函数h。然后将单应矩阵用于使新图像变形以适合目标框架。新图像被复制到目标帧中。

    2.7K40

    OpenCV2 计算机视觉应用编程秘籍:1~5

    因此,在这种情况下,矩阵元素由值的三元组组成。 如上一章所述,OpenCV 还允许您创建具有不同类型(例如,整数(CV_8U)和浮点数[CV_32F)的像素值的矩阵(或图像)。...实际上,几乎所有需要对图像执行的操作都具有 OpenCV 函数。 更多 也可以在cv::Mat实例或cv::Mat实例的各个通道上使用常规的 C++ 算术运算符。 以下两个小节说明了如何执行此操作。...像素值在整个图像上的分布构成了此图像的重要特征。 本章介绍图像直方图的概念。 您将学习如何计算直方图以及如何使用它来修改图像的外观。 直方图还可以用于表征图像的内容并检测图像中的特定对象或纹理。...如果查看显示特定纹理或特定对象的图像区域,则该区域的直方图可以看作是一个函数,给出给定像素属于该特定纹理或对象的概率。 在本秘籍中,您将学习如何将图像直方图有利地用于检测特定图像内容。...膨胀是互补运算符,它用定义的像素集中找到的最大像素值替换当前像素。 由于输入的二进制图像仅包含黑色(0)和白色(255)像素,因此每个像素都由白色或黑色像素替换。

    3.1K10

    opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波

    / ** @brief使用框过滤器模糊图像。 该函数使用内核对图像进行平滑处理: 未归一化的框式滤波器可用于计算每个像素邻域的各种积分特征, 例如图像导数的协方差矩阵(用于密集光流算法等)。...该函数使用内核对图像进行平滑处理: @param src输入图像; 它可以具有任意数量的通道,这些通道是独立处理的,但是深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。...@param src输入图像;图像可以具有任意数量的经过处理的通道 但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。...@note中值过滤器内部使用#BORDER_REPLICATE来处理边框像素,请参阅#BorderTypes @param src输入1、3或4通道图像;当ksize为3或5时, 图像深度应为CV_8U...,CV_16U或CV_32F,对于较大的光圈,只能为CV_8U。

    1.4K20

    【Python3+OpenCV】实现图像处理—灰度变换篇

    本文将介绍如何在Python3中使用OpenCV实现对图像处理的灰度变换: 灰度化处理,二值化处理,伽马变换,对数变换,反向变换 ? 电脑环境准备 Python版本: Python3.7 ?...灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素点比较亮,反之比较暗,像素值最大为255(表示白色),像素值最小为0(表示黑色)。 ?...No.2 二值化处理 Opencv中的图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。...No.3 灰度图像的伽马变换 Opencv中的伽马变换是用来图像增强,提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足...No.5 灰度图像的反色变换 Opencv中的反色变换:对原图像像素值的颜色进行反转,即黑色变为白色,白色变为黑色。

    6.4K10

    使用 OpenCV 的基于标记的增强现实

    尺寸为 6X6 的 ArUco 标记 ArUco 标记是一种合成方形标记,内部的二进制矩阵包含在带有唯一标识符的宽黑色边框内。在 ArUco 标记中, 黑色表示1,白色表示0。...标记大小决定了内部二进制矩阵的大小。ArUco 标记中的奇数块代表奇偶校验位,标记中的偶数方块代表数据位。 黑色边框便于在图像内快速检测,二进制矩阵允许对其进行识别。...导入所需的库 import numpy as np import cv2 import imutils 检测图像中的 ArUco 标记 要检测图像中的 ArUco 标记, 分析图像以找到作为标记候选的正方形形状...在 OpenCV 中,ArUco 标记字典遵循命名约定cv2.aruco.DICT_NxN_M,其中 N 是二进制矩阵的大小,代表标记的大小,M 是字典中 ArUco 标记的数量。...计算视频帧和将要叠加的图像之间的单应性。 单应性是一个图像中的点到另一图像中的对应点的变换映射。

    1.4K20

    【实战】使用ArUco标记实现增强现实

    它是一个背景为黑色的正方形,正方形内部的白色图案用来表示标记的唯一性,并且存储一些信息。黑色边界的目的是为了提高ArUco标记检测的准确性和性能。...每个词典中所有的Aruco标记均包含相同数量的块或位(例如4×4、5×5、6×6或7×7),且每个词典中Aruco标记的数量固定(例如50、100、250或1000)。...OpenCV在其文档中详细描述了姿势估计过程。 本文中,我们将把ArUco标记用于增强现实应用程序,该程序可以将任何新场景叠加到现有图像或视频上。...图像的替换过程我们可以通过如下代码实现: C++代码 // Compute homography from source and destination points Mat h = cv::findHomography...使用OpenCV中的findHomography函数计算源点和目标点之间的单应性函数h。然后将单应矩阵用于使新图像变形以适合目标框架。新图像被复制到目标帧中。

    2K10

    OpenCV3 安卓应用编程:1~6 全

    从传递的CvCameraViewFrame中,我们可以获取 RGBA 彩色或灰度格式的Mat图像。...Core.split(Mat m, ListMat> mv)方法负责信道拆分。 它以源矩阵和目标矩阵列表作为参数。 将源中的每个通道复制到目标列表中的单通道矩阵中。...我们可以将权重放在称为卷积矩阵或核的矩阵中。...这样的讨论促进了对 OpenCV(尤其是cv::Mat)如何以及为什么查看原始图像数据的更深入的了解。 现在,让我们编写相应的源文件RecolorRCFilter.cpp。...通过使用过滤边缘查找内核并将结果反转,我们得到了白色背景上黑色边缘的图像。 然后,我们将此中间结果与源图像相乘,以生成目标图像,该图像在正常的彩色背景上具有黑色边缘。

    5.3K10

    OpenCV 即时入门(全)

    “快速入门 – OpenCV 基础知识”本节将向您展示如何在 OpenCV 中执行一些基本任务以及如何编写第一个程序。 “您需要了解的的前 5 个功能”在这里,您将学习如何执行图像转换和像素操作。...数字图像不过是像素集合 (图片元素),然后将其存储在 OpenCV 中的矩阵中以进行进一步处理。 在矩阵中,每个元素都包含有关图像中特定像素的信息。 像素值决定该像素应具有的亮度或颜色。...因此,我们现在将看到如何在 OpenCV 中执行像素操作。 任务 给定灰度或彩色图像,请执行像素操作。 算法 对于灰度和彩色图像,该算法非常相似。 让我们首先了解有关灰度图像的算法。...第一个是包含源图像(我们要转换的图像)的矩阵,而第二个是我们要在其中存储转换后的图像的矩阵。 第三个参数指定我们要执行的转换类型,在本例中为CV_BGR2GRAY。...第一个参数是包含隐写图像的矩阵。 第二个是包含图像的矩阵,其中我们隐藏了所需的图像。 第三个参数是包含所需或隐藏图像的矩阵。

    1.5K21

    图像腌膜Mask的常规操作你真的信手拈来吗?

    图像转为灰度图像存入到Mask中: Mat mask;//定义腌膜 cvtColor(logoImage, mask, COLOR_BGR2GRAY);//将logo转成灰度图 处理后得到如下灰度图...2,对腌膜Mask这个图像矩阵进行取反操作: bitwise_not(mask, mask);//对mask图像取反,白色(255)变成黑色(0) 对于上面操作我们需要多加解释一下。...因为我们开头说过,在腌膜中黑色无效,白色有效,而我们得灰度图的底色确实白色的,字确实黑色的,所以进行取反操作,结果如下: ?...三:添加非矩形的Mask区域 我们选取ROI区域一般都是用矩形,所以圈出来的区域都是矩形的,如何添加非矩形的呢?..., logo2Image.rows)); 2,创建一个同logo一样大的纯黑的腌膜mask: Mat mask = Mat::zeros(logo2Image.size(), CV_8UC1); 3,

    1.3K20
    领券