GVKun编程网logo

Python OpenCV 泛洪填充,取经之旅第 21 天(python opencv 膨胀)

1

如果您对PythonOpenCV泛洪填充,取经之旅第21天感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于PythonOpenCV泛洪填充,取经之旅第21天的详细内容,我们还

如果您对Python OpenCV 泛洪填充,取经之旅第 21 天感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Python OpenCV 泛洪填充,取经之旅第 21 天的详细内容,我们还将为您解答python opencv 膨胀的相关问题,并且为您提供关于36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录、AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)、cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:、OpenCV - Windows(win10)编译 opencv + opencv_contrib的有价值信息。

本文目录一览:

Python OpenCV 泛洪填充,取经之旅第 21 天(python opencv 膨胀)

Python OpenCV 泛洪填充,取经之旅第 21 天(python opencv 膨胀)

学习目标

每天 1 小时,365 天成就奇迹。

今天学习 Python OpenCV 泛洪填充相关知识,泛洪填充也叫做水漫填充算法。

原理是 从一个像素点开始,将附近满足像素要求的点,全部填充成指定颜色,直到碰到不满足要求的点。

如果从概念上记忆,常见的有四邻域像素填充法,八邻域像素填充法,基于扫描线的像素填充方法。

对于这些概念,先略过,没有建立整体认知之前,学习任何基础概念都毫无价值。

函数原型

泛洪填充的语法原型如下:

floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) -> retval, image, mask, rect

该函数包括七个参数,分别如下:

  • image:操作的图像
  • mask:掩膜,比 image 的高度多 2 个像素,宽度多 2 个像素。填充时不能穿过输入掩码中的非零像素
  • seedPoint:起始的像素点
  • newVal:新的填充值(颜色)
  • loDiff:填充颜色的低值(起始像素点处颜色减去该值)
  • upDiff:填充颜色的高值 (起始像素点处颜色加上该值)
  • flags:操作位标识符,彩色图像一般是FLOODFILL_FIXED_RANGE 指定颜色填充

关于 flags 还找到一个清晰的说明:

当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,如果满足(s – loDiff, s + upDiff)之间(s 为种子点像素值),则填充;
当为CV_FLOODFILL_MASK_ONLY 时,则 mask 不能为空,此时,函数不填充原始图像 img,而是填充掩码图像.

案例代码

测试图片如下:

Python OpenCV 泛洪填充,取经之旅第 21 天

测试代码如下:

import cv2 as cv
import numpy as np

# 彩色图像填充
def fill_color_demo(src):
    img_copy = src.copy()
    h, w, ch = src.shape
    # 声明一个矩形形状,注意高度和宽度都增加 2 个像素
    # np.zeros 返回一个给定形状和类型的用 0 填充的数组
    mask = np.zeros([h+2, w+2], np.uint8)
    # 参数1,待使用泛洪填充的图像
    # 参数2,掩膜,使用掩膜可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩膜大小为原图行数 + 2,列数 + 2
    #       掩膜,是一个二维的0矩阵,因为只有掩膜上对应为 0 的位置才能泛洪
    # 参数3,泛洪填充的种子点,基于该点的像素判断和它相近颜色的像素点,是否被泛洪处理
    # 参数4,泛洪区域的新颜色(BGR格式)
    # 参数5,种子点像素可以向下的像素值
    # 参数6,种子点像素可以向上的像素值
    # 参数7,泛洪算法的处理模式
    cv.floodFill(img_copy, mask, (20, 20), (0, 255, 0),
                 (50, 50, 50), (100, 100, 100), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("color_demo", img_copy)


if __name__ == "__main__":
    src = cv.imread(''./25.jpg'')

    fill_color_demo(src)
    cv.waitKey()
    cv.destroyAllWindows()

运行之后的效果如下:
Python OpenCV 泛洪填充,取经之旅第 21 天
关于在设置掩膜的时候,为什么像素要 +2,部分地方给出的解释是:当从 0 行 0 列开始泛洪填充扫描时,mask 多出来的 2 可以保证扫描的边界上的像素都会被处理。暂时先理解一下吧。

关于参数 5 与参数 6,找到如下资料:

从起始的种子点开始,用指定颜色填充与其相连的像素。连通性取决于相邻像素的颜色和亮度,像素在下列情况下被属于重新绘制的区域,公式如下。
Python OpenCV 泛洪填充,取经之旅第 21 天
在通俗的说明如下:

  • (20, 20):为种子点的位置;
  • (0, 255, 0):为泛洪填充颜色,绿色;
  • (50, 50, 50):以种子点像素三通道值[ b, g, r ]为基准,被填充范为在原图三通道最低值为[ b-50, g-50, r-50 ];
  • (100, 100, 100):以种子点像素三通道值[ b, g, r ]为基准,被填充范为在原图三通道最高值为[ b+100, g+100, r+100];
  • cv.FLOODFILL_FIXED_RANGE:待处理的像素点与种子点作比较,在范围之内,则填充此像素。

在原图像只有像素三通道值[ b-50, g-50, r-50 ] <= [ B , G, R] <=[ b+100, g+100, r+100]在此范围内的都会被指定绿色(0, 255, 0)填充。

二值图像填充

先看代码,注意注释部分。

import cv2 as cv
import numpy as np

def fill_binary():
    # 设置一个400*400的矩形
    image = np.zeros([400, 400, 3], np.uint8)
    # 内部填充一个白色正方形

    image[100:300, 100:300, :] = 255
    cv.imshow("fill_binary", image)

    # 设置掩膜
    mask = np.ones([402, 402], np.uint8)
    mask[101:301, 101:301] = 0
    # mask不为0的区域不会被填充,mask为0的区域才会被填充
    cv.floodFill(image, mask, (200, 200), (255, 255, 0),
                 cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled_binary", image)

fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()

这部分代码来源网络,重点理解 FLOODFILL_MASK_ONLY 即可,该值表示从种子点开始,填充掩膜区域。

OpenCV 尾声

1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?

做为初学者,还有很多地方学习的不深入,希望你与我一起坚持下去。

空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。

想学 Python 爬虫,可以订阅橡皮擦专栏哦~ 点击发现惊喜


今天是持续写作的第 59 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注博主,或者关注博主公众号 “非本科程序员”,了解一个非本科程序员是如何成长的。
博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏

本文同步分享在 博客“梦想橡皮擦”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录

36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录

基础版学习笔记传送门
36 篇博文带你学完 opencv :python3+opencv 学习笔记汇总目录(基础版)

进阶版笔记

项目
opencv 进阶学习笔记 1: 调用摄像头用法大全(打开摄像头,打开摄像头并实时不断截屏,读取视频并截图)
opencv 进阶学习笔记 2:numpy 操作图像,色彩空间,查找指定颜色范围,通道分离与合并
opencv 进阶学习笔记 3:像素运算和图像亮度对比度调节
opencv 进阶学习笔记 4:ROI 和泛洪扩充
opencv 进阶学习笔记 5:图像模糊操作,图像锐化,边缘保留滤波 EPF(图像滤镜)
opencv 进阶学习笔记 6:使用鼠标在图像上绘制矩形框或者多边形框
opencv 进阶学习笔记 7:直方图,直方图均衡化,直方图比较,直方图反向投影
opencv 进阶学习笔记 8:模板匹配
opencv 进阶学习 9:图像阈值大全,图像二值化,超大图像二值化
opencv 进阶学习笔记 10:图像金字塔和图像梯度
opencv 进阶学习笔记 11:cannny 边缘检测,直线检测,圆检测
opencv 进阶学习笔记 12:轮廓发现和对象测量
opencv 进阶学习笔记 13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python 版
opencv 进阶学习笔记 14:分水岭算法 实现图像分割

OpenCV 告一段落,接下来,该实战啦。
计算机视觉三大任务,分类,监测,分割。
意见其他一些任务…
图像生成,OCR…


电气专业的计算机萌新,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。

AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)

AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)

如何解决AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)

我决定尝试 Ar 是什么,但遇到了以下问题:

  1. File "C:/Users/Егор/PycharmProjects/ARfotoandvideo/AR.py",line 25,in <module>
  2. macthes = bf.knnMatch(des1,des2,k=2)
  3. cv2.error: OpenCV(4.5.1) C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\pip-req-build-0ycehs0d\\opencv\\modules\\core\\src\\batch_distance.cpp:275: error: (-215:Assertion Failed) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function ''cv::batchdistance''

堆栈:

  • Windows 8.1 一种语言
  • Python 3.7.7
  • Pycharm 社区 2018.3.7
  • Opencv-python 4.5.1.48
  • 网络摄像头 - 在笔记本电脑上,我无法通过 wifi 连接通过 Droidcam 应用程序使用小米手机 Redmy 的摄像头。

信息

我将尝试描述之前发生的错误以及我是如何解决它们的 - 也许这会告诉您需要做什么来解决问题。

在程序执行期间,在从网络摄像头接收图像时发生崩溃 - 正如它本身所表现的那样,当程序启动时,来自网络摄像头的图像提供单色背景(在我的情况下,绿松石) ,当我通过点击X强行关闭所有窗口后,窗口中的数据被刷新并获得正确的图像。 cv2.waitKey (100) 部分解决了这个问题,其中更改 100 的值会导致来自网络摄像头的图像出现,!!!!但 !!!因为有失败,所以没有确定性。

尝试将 cv2.error 中所有可能的错误原因联系起来后,我得出的结论是问题出在 1 和 2 图像上的描述符中。我想指出的是,当网络摄像头相对于图像移动(不是缩放,而是前后移动)时,在 30 种情况下的 1-2 种情况下,它有助于启动程序并正常工作而不会崩溃。>

我的代码

  1. import cv2
  2. import numpy as np
  3. cap = cv2.VideoCapture(1,cv2.CAP_DSHOW)
  4. imgTarget = cv2.imread(''foto.jpg'')
  5. myVid = cv2.VideoCapture(''video.mp4'')
  6. success,imgVideo = myVid.read()
  7. hT,wT,cT = imgTarget.shape
  8. imgVideo = cv2.resize(imgVideo,(wT + 400,hT))
  9. orb = cv2.ORB_create(nfeatures=10)
  10. kp1,des1 = orb.detectAndCompute(imgTarget,None)
  11. imgTarget = cv2.drawKeypoints(imgTarget,kp1,None)
  12. while True:
  13. success,imgWebcam = cap.read()
  14. kp2,des2 = orb.detectAndCompute(imgWebcam,None)
  15. imgWebcam = cv2.drawKeypoints(imgWebcam,kp2,None)
  16. # imgWebcam = cv2.resize(imgWebcam,(wT,hT))
  17. bf = cv2.BFMatcher()
  18. macthes = bf.knnMatch(des1,k=2)
  19. good = []
  20. for m,n in macthes:
  21. if m.distance < 0.75 * n.distance:
  22. good.append(m)
  23. print(len(good))
  24. imgFeatures = cv2.drawMatches(imgTarget,imgWebcam,good,None,flags=2)
  25. if len(good) > 20:
  26. srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
  27. dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,2)
  28. matrix,mask = cv2.findHomography(srcPts,dstPts,cv2.RANSAC,5)
  29. print(matrix)
  30. pts = np.float32([[0,0],[0,wT],[wT,hT],0]]).reshape(-1,2)
  31. dst = cv2.perspectiveTransform(pts,matrix)
  32. img2 = cv2.polylines(imgWebcam,[np.int32(dst)],True,(255,255),3)
  33. cv2.imshow(''img2'',img2)
  34. cv2.imshow(''imgFeatures'',imgFeatures)
  35. cv2.imshow(''imgTarget'',imgTarget)
  36. cv2.imshow(''myVid'',imgVideo)
  37. cv2.imshow(''imgWebcam'',imgWebcam)
  38. cv2.waitKey(100)

cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:

cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:

image1=Image.fromarray(cv2.cvtColor(image01,cv2.COLOR_BGR2RGB))
cv2.error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ''cvtColor''

这个错误纠结了一周,网上找遍了答案,加上自己根据他们错误找,大多数都是图片路径,或者图片本身的错误

 

我自己的错误是 xml 转 json 文件出错,在看完一周重新分割数据以及转 json,终于可以运行。

 

这类错误大多数是图片路径读取有问题,大家可以先去找图片路径拼接那块是不是出现 None,可以适当打印出路径来调试,当然出现这种错误,最先看看,自己对图片的处理是不是正确的,基本上跑源码,除了个别修改配置文件,其他没问图,所以最讨厌的问题得抓最核心的地方,毕竟时间宝贵!!!

OpenCV - Windows(win10)编译 opencv + opencv_contrib

OpenCV - Windows(win10)编译 opencv + opencv_contrib

  在之前的几篇文章中,我提到了在 Android、Linux 中编译 opencv + opencv_contrib,这篇文章主要讲在 Windows 中编译 opencv + opencv_contrib。

首先需要准备的环境有:

  • Window 10 64 位:这个大家都知道,就不多说了啊;
  • Cmake:编译工具,可以 https://cmake.org/download/ 下载安装,当前的最新版本为 3.10.1;
  • Visual Studio:开发工具,编译的时候也需要用到,我安装的是 Visual Studio 2015。
  • OpenCV Windows 包,下载地址:https://opencv.org/releases.html;
  • OpenCV_Contrib 包,下载地址:https://github.com/opencv/opencv_contrib(注意版本对应)。

  将下载得到的 OpenCV Windows 包解压,目录为 opencv,然后将下载的 OpenCV_Contrib 包解压放入 opencv 目录下,新建 new_build 文件夹(用来放编译之后结果):

    

使用 cmake 生成 OpenCV.sln:

  打开安装之后的 cmake,在 where is the source code 中选择 openCV 的源代码目录:F:\opencv\sources;在 where to build the binaries 中选择编译为 Visual Studio 项目的目录:F:\opencv\new_build(这里我选择刚刚特地建立的 new_build 目录),如下图所示:

    

  点击 Configure 按钮后,弹出对话框,选择编译器,根据本地计算机的 CPU 架构,这里特别要注意的是,自己机器上是否装有相应的 VS 版本,如果没有装,还是要编译就会出错,可能是找不到对应的工具原因,以及选择 X86 和 X64),这里用的是 VS 2015。

    

  设置完成之后点击 “Generate” 开始生成工程,. 第一次编译完成之后,我们需要将额外的 opencv_contrib 加到工程中进行第二次编译,在配置表中找到 “OPENCV_EXTRA_MODULES_PATH”, 设置其参数值为 open_contrib 源码包中的 modles 目录,我的目录是 “F:\opencv\opencv_contrib\modules”:

    

  再次点击 “Generate” 进行第二次编译:

    

  这时候我们已经可以看见用 cmake 工具编译得到的 OpenCV.sln:

    

用 VS 打开 OpenCV.sln 工程,编译生成 Debug 和 Release 库:

  用 VS 2015 打开 OpenCV.sln 工程,在解决方案中可以查看工程目录:

    

  编译生成 debug 版本的库,记得在此之前要选择编译的平台信息,这就是编译生成 debug 版本和 release 版本的区别,也可以选择 release,因为自己的工程可能要用到相应的动态链接库:

    

  在解决方案中选中工程,右键选择重新生成解决方案:

    

  编译成功:

    

  . 找到 CMakeTargets 中的 INSTALL,然后右键选择 “仅限于项目”-->“仅生成 INSTALL”:

    

  完成编译后,Release 模式下同理。此时,有了 install 目录。该目录包含了我们需要的头文件、库文件。

    

把新的库文件配置到到项目中:

   VC++ 目录 --> 包含目录,添加:

    E:\OpenCV320\opencv\new_build\install\include

  VC++ 目录 --> 库目录,添加:

    E:\OpenCV320\opencv\new_build\install\x64\vc14\lib

  链接器 --> 输入 --> 附加依赖项,添加: (注意添加的库与编译选项要一致,需要注意 debug 比 release 的文件名多了个 d)

    opencv_aruco320.lib

    opencv_aruco320d.lib

    opencv_bgsegm320.lib
    opencv_bgsegm320d.lib
    opencv_bioinspired320.lib
    opencv_bioinspired320d.lib
    opencv_calib3d320.lib
    opencv_calib3d320d.lib
    opencv_ccalib320.lib
    opencv_ccalib320d.lib
    opencv_core320.lib
    opencv_core320d.lib
    opencv_datasets320.lib
    opencv_datasets320d.lib
    opencv_dnn320.lib
    opencv_dnn320d.lib
    opencv_dpm320.lib
    opencv_dpm320d.lib
    opencv_face320.lib
    opencv_face320d.lib
    opencv_features2d320.lib
    opencv_features2d320d.lib
    opencv_flann320.lib
    opencv_flann320d.lib
    opencv_fuzzy320.lib
    opencv_fuzzy320d.lib
    opencv_highgui320.lib
    opencv_highgui320d.lib
    opencv_imgcodecs320.lib
    opencv_imgcodecs320d.lib
    opencv_line_descriptor320.lib
    opencv_line_descriptor320d.lib
    opencv_ml320.lib
    opencv_ml320d.lib
    opencv_objdetect320.lib
    opencv_objdetect320d.lib
    opencv_optflow320.lib
    opencv_optflow320d.lib
    opencv_phase_unwrapping320.lib
    opencv_phase_unwrapping320d.lib
    opencv_photo320.lib
    opencv_photo320d.lib
    opencv_plot320.lib
    opencv_plot320d.lib
    opencv_reg320.lib
    opencv_reg320d.lib
    opencv_rgbd320.lib
    opencv_rgbd320d.lib
    opencv_saliency320.lib
    opencv_saliency320d.lib
    opencv_shape320.lib
    opencv_shape320d.lib
    opencv_stereo320.lib
    opencv_stereo320d.lib
    opencv_stitching320.lib
    opencv_stitching320d.lib
    opencv_structured_light320.lib
    opencv_structured_light320d.lib
    opencv_superres320.lib
    opencv_superres320d.lib
    opencv_surface_matching320.lib
    opencv_surface_matching320d.lib
    opencv_text320.lib
    opencv_text320d.lib
    opencv_tracking320.lib
    opencv_tracking320d.lib
    opencv_video320.lib
    opencv_video320d.lib
    opencv_videoio320.lib
    opencv_videoio320d.lib
    opencv_videostab320.lib
    opencv_videostab320d.lib
    opencv_xfeatures2d320.lib
    opencv_xfeatures2d320d.lib
    opencv_ximgproc320.lib
    opencv_ximgproc320d.lib
    opencv_xobjdetect320.lib
    opencv_xobjdetect320d.lib
    opencv_xphoto320.lib
    opencv_xphoto320d.lib
    kernel32.lib
    user32.lib
    gdi32.lib
    winspool.lib
    comdlg32.lib
    advapi32.lib
    shell32.lib
    ole32.lib
    oleaut32.lib
    uuid.lib
    odbc32.lib
    odbccp32.lib

  这样,我们就可以在 VS 中使用 OpenCV 了。

 

  需要提到的一个点,所需要使用 Sift 等算法,需要引入 xfeatures2d 命名空间:

using namespace xfeatures2d;

 

   

关于Python OpenCV 泛洪填充,取经之旅第 21 天python opencv 膨胀的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录、AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)、cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:、OpenCV - Windows(win10)编译 opencv + opencv_contrib的相关信息,请在本站寻找。

本文标签: