使用GrabCut做分割
主要完成了界面化设计,代码如下
import cv2 as cv
import numpy as np
import sys
from PyQt5.Qt import *
class MyWediget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("分割烟草")
self.setWindowIcon(QIcon("2.jpg"))
self.setFixedSize(800, 430)
self.setup_ui()
self.arg = ""
def setup_ui(self):
def test():
fd = QFileDialog(window, "选择一个文件", "../", "All(*.*);;Images(*.png *.jpg);;Python文件(*.py)")
fd.move(200,0)
fd.setLabelText(QFileDialog.FileName, "我的文件")
fd.setLabelText(QFileDialog.Accept, "接受") fd.setLabelText(QFileDialog.Reject, "拒绝")
fd.setFileMode(QFileDialog.ExistingFiles)
def path(val):
inputPath.setText(val)
self.segmentation(val)
fd.fileSelected.connect(path)
fd.open()
inputPath = QLineEdit(self)
inputPath.resize(300,30)
btn = QPushButton(self)
btn.setText("选择文件")
def click():
btn.isDefault()
if len(inputPath.text()) > 0:
evt = QKeyEvent()
if evt.modifiers() == Qt.EnterKeyGo:
btn.pressed.connect(click)
btn.move(300,0)
btn.clicked.connect(test) def segmentation(self,val):
windows = QWidget(self)
windows.resize(400,400)
windows.move(0,30) w2 = QWidget(self)
w2.move(400,30)
w2.resize(400,400) self.arg = val
inputPath = QLineEdit(self)
inputPath.setText(self.arg) src = cv.imread(self.arg)
print(src.shape)
w = int(src.shape[1])
h = int(src.shape[0]) if w>1000 or h>800:
w = int(w/2)
h = int(h/2)
# print(w+" "+h)
src = cv.resize(src, (w, h), interpolation=cv.INTER_CUBIC)
r = cv.selectROI('Draw a rectangle', src, False) # 返回 (x_min, y_min, w, h)\ roi = src[int(r[1]):int(r[1] + r[3]), int(r[0]):int(r[0] + r[2])] # 原图mask
mask = np.zeros(src.shape[:2], dtype=np.uint8) # 矩形roi
rect = (int(r[0]), int(r[1]), int(r[2]), int(r[3])) # 包括前景的矩形,格式为(x,y,w,h) bgdmodel = np.zeros((1, 65), np.float64) # bg模型的临时数组
fgdmodel = np.zeros((1, 65), np.float64) # fg模型的临时数组 cv.grabCut(src, mask, rect, bgdmodel, fgdmodel, 11, mode=cv.GC_INIT_WITH_RECT) # 提取前景和可能的前景区域
mask2 = np.where((mask == 1) + (mask == 3), 255, 0).astype('uint8') print(mask2.shape) result = cv.bitwise_and(src, src, mask=mask2)
cv.imwrite('result.jpg', result)
cv.imwrite('roi.jpg', roi) print("over")
w2.setStyleSheet("border-image:url(roi.jpg)")
windows.setStyleSheet("border-image:url(result.jpg)") w2.show()
windows.show() if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWediget()
window.show()
sys.exit(app.exec_())
第一、选择图像文件
第二、画出矩形框
第三、回车得到分割结果
如果想要生成exe文件,就需要配置.spec文件。请访问我的github。
使用GrabCut做分割的更多相关文章
- 在CMD中使用for命令对单行字符串做分割的方法
我们都知道CMD中的for命令是执行循环命令的,数据来源可以是一个文件,一个命令的结果或一个字符串,只有这3种来源 如果是一个文件则对这个文件的所有字符串进行循环处理 如果是一个命令结果,那么对这个命 ...
- 如何从视频中分离出音乐,和对音乐做分割,合并的处理(瑞典音乐家-新八宝盒.mp3.rar下载)
点击下载:瑞典音乐家-新八宝盒.mp3.rar 1.工具 Total Video Converter 3.71 视频处理(安装软件,有绿色版的) MP3剪切器 MP3剪切器(小工具) Mp3mateP ...
- 将数组按指定个数分割,并以"|"做分割
```js function sliceArray(arr,num){ let newArr=[] for (var i = 0; i < arr.length; i+=num) { if(ar ...
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
图像分割之(四)OpenCV的GrabCut函数使用和源码解读 分类: 图像处理 计算机视觉 2013-01-23 ...
- opencv学习之路(31)、GrabCut & FloodFill图像分割
一.GrabCut 1.利用Rect做分割 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat ...
- 基于传统方法点云分割以及PCL中分割模块
之前在微信公众号中更新了以下几个章节 1,如何学习PCL以及一些基础的知识 2,PCL中IO口以及common模块的介绍 3,PCL中常用的两种数据结构KDtree以及Octree树的介绍 ...
- 用CorelDRAW等分分割图片的方法
在CorelDRAW中,想要将图片等分分割可以通过放置容器来实现,根本不需要裁剪工具和辅助线.例如两等分:首先要建立确定等分的份数,建立长方形或正方形.然后把图片放置容器,调整位置,做无缝拼接就可以了 ...
- CString 字符串转化和分割
1.格式化字符串 CString s;s.Format(_T("The num is %d."), i);相当于sprintf() 2.转为 int 转10进制最好用_ttoi() ...
- 如何分割(split)string字符串
使用String#split()方法 如下所示: String string = "004-034556"; String[] parts = string.split(" ...
- sql 针对多个id或名称的分割和组合
开发中经常遇到把多个id拼接在一起符号隔开传入数据库,那拆分呢就是个大事 SELECT nPushID INTO #temp FROM Table1 ), nCoulmn) SELECT * FROM ...
随机推荐
- 【RabbitMQ】10 深入部分P3 死信队列(交换机)
1.死信交换机 说是死信队列,是因为RabbitMQ和其他中间件产品不一样 有交换机的概念和这个东西存在,别的产品只有队列一说 DeadLetterExchange 消息成为DeadMessage之后 ...
- 【SpringCloud】 Re02 Nacos
运行Nacos注册中心 win版Nacos在bin目录下打开cmd 执行此命令以运行单机模式的Nacos startup.cmd -m standalone 控制台输出: Microsoft Wind ...
- 【Mybatis-Plus】03 SpringBoot整合
创建SpringBoot工程: 选择辅助三件套: 再导入MP相关依赖坐标: <!-- jdbc --> <dependency> <groupId>mysql< ...
- 【转载】 Tensorflow如何直接使用预训练模型(vgg16为例)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_44633882/artic ...
- 两个 RTX2070 super 显卡 可不可以通过 nvlink交换机 进行P2P通信 呢? (答案: 可以)
以前转载了一篇文章: https://www.cnblogs.com/devilmaycry812839668/p/12370685.html 对于里面的结果总感觉有所怀疑,于是斥巨资购入两个 ...
- mojo编程语言:编译后的mojo二进制执行文件调用python库报错——设置MOJO_PYTHON_LIBRARY变量
代码: from python import Python fn f() raises: # This is equivalent to Python's `import numpy as np` l ...
- 微信支付java版(含视频讲解)
1.背景 实际开发中用到微信支付的概率非常大, 至于为什么这里不必要我多少...... 微信支付大体需要对接的核心接口有 其实大部分支付都是这些,就像上一节我们讲的支付宝支付一样 这里以常用的H5支付 ...
- jQuery的基本操作总结
什么是jquery? 就是一个用js的插件库 解决了原生dom的操作的兼容性和代码量 使用前需要引入它的js库 以下例子以 jQuery1.12.4.js 这个版本为例 一:jQuery入口函数 ...
- 面试必问之redis
这里是我作为10年面试经验总结的面试中必问问题 问题一 简单介绍下redis redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于M ...
- NeoVim 安装
NeoVim 官网 安装 macOS brew install neovim Windows 使用 winget: winget install Neovim.Neovim 也可以使用 scoop: ...