OpenCV计算机视觉实战 - 文档扫描OCR识别【项目实战】

2023-11-12

#################################################################
纸上得来终觉浅,绝知此事要躬行
B站视频
新课件:https://pan.baidu.com/s/1frWHqCVGR2VTn5QBtW4lPA 提取码:xh02
老课件:https://pan.baidu.com/s/1Wi31FxSPBqWiuJX9quX-jA 提取码:bbfg
################################################################

检测流程:

边缘检测 -> 获得轮廓 -> 透视变换(即放平,包括平移旋转反转等) -> OCR识别
在这里插入图片描述

一、边缘检测

if __name__ == "__main__":
	# 读取输入
	image = cv2.imread(args["image"])
	# resize 坐标也会相同变化
	ratio = image.shape[0] / 500.0
	orig = image.copy()
image <span class="token operator">=</span> resize<span class="token punctuation">(</span>orig<span class="token punctuation">,</span> height <span class="token operator">=</span> <span class="token number">500</span><span class="token punctuation">)</span>	<span class="token comment"># 同比例变化:h指定500,w也会跟着变化</span>

<span class="token comment"># 预处理</span>
gray <span class="token operator">=</span> cv2<span class="token punctuation">.</span>cvtColor<span class="token punctuation">(</span>image<span class="token punctuation">,</span> cv2<span class="token punctuation">.</span>COLOR_BGR2GRAY<span class="token punctuation">)</span>
gray <span class="token operator">=</span> cv2<span class="token punctuation">.</span>GaussianBlur<span class="token punctuation">(</span>gray<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
edged <span class="token operator">=</span> cv2<span class="token punctuation">.</span>Canny<span class="token punctuation">(</span>gray<span class="token punctuation">,</span> <span class="token number">75</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span>	<span class="token comment"># 边缘检测</span>

<span class="token comment"># 展示预处理结果</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"STEP 1: 边缘检测"</span><span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span><span class="token string">"Image"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span><span class="token string">"Edged"</span><span class="token punctuation">,</span> edged<span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>waitKey<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>destroyAllWindows<span class="token punctuation">(</span><span class="token punctuation">)</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述
注:

  • Line 5:缩放比例 ratio 也可以resize后再计算,透视变换中还原到原始的原图上时,需要用到ratio

二、获得轮廓

在main函数下

	# 轮廓检测
	cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
	# cnts中可检测到许多个轮廓,取前5个最大面积的轮廓
	cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
<span class="token comment"># 遍历轮廓</span>
<span class="token keyword">for</span> c <span class="token keyword">in</span> cnts<span class="token punctuation">:</span>	<span class="token comment"># C表示输入的点集</span>
	<span class="token comment"># 计算轮廓近似</span>
	peri <span class="token operator">=</span> cv2<span class="token punctuation">.</span>arcLength<span class="token punctuation">(</span>c<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">)</span>
	<span class="token comment"># epsilon表示从原始轮廓到近似轮廓的最大距离,它是一个准确度参数</span>
	<span class="token comment"># True表示封闭的</span>
	approx <span class="token operator">=</span> cv2<span class="token punctuation">.</span>approxPolyDP<span class="token punctuation">(</span>c<span class="token punctuation">,</span> <span class="token number">0.02</span> <span class="token operator">*</span> peri<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">)</span>
	<span class="token keyword">print</span><span class="token punctuation">(</span>approx<span class="token punctuation">,</span>approx<span class="token punctuation">.</span>shape<span class="token punctuation">)</span>
	<span class="token comment"># 4个点的时候就拿出来,screenCnt是这4个点的坐标</span>
	<span class="token keyword">if</span> <span class="token builtin">len</span><span class="token punctuation">(</span>approx<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">4</span><span class="token punctuation">:</span>	<span class="token comment"># 近似轮廓得到4个点,意味着可能得到的是矩形</span>
		screenCnt <span class="token operator">=</span> approx	<span class="token comment"># 并且最大的那个轮廓是很有可能图像的最大外围</span>
		<span class="token keyword">break</span>

<span class="token comment"># 展示结果</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"STEP 2: 获取轮廓"</span><span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>drawContours<span class="token punctuation">(</span>image<span class="token punctuation">,</span> <span class="token punctuation">[</span>screenCnt<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span><span class="token string">"Outline"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>waitKey<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>
cv2<span class="token punctuation">.</span>destroyAllWindows<span class="token punctuation">(</span><span class="token punctuation">)</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在这里插入图片描述

三、透视变换

在main函数下

	# 透视变换
	# 4个点的坐标 即4个(x,y),故reshape(4,2)
	# 坐标是在变换后的图上得到,要还原到原始的原图上,需要用到ratio
	print(screenCnt.shape)
	warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • reshape 其实是获得一个新矩阵,不改变screenCnt的形状
    在这里插入图片描述

同一个py文件中,在main函数前,透视变换函数 four_point_transform

def order_points(pts):
	# 初始化4个坐标点的矩阵
	rect = np.zeros((4, 2), dtype = "float32")
<span class="token comment"># 按顺序找到对应坐标0123分别是 左上,右上,右下,左下</span>
<span class="token comment"># 计算左上,右下</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"pts :\n "</span><span class="token punctuation">,</span>pts<span class="token punctuation">)</span>
s <span class="token operator">=</span> pts<span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span>axis <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span>		<span class="token comment"># 沿着指定轴计算第N维的总和</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"s : \n"</span><span class="token punctuation">,</span>s<span class="token punctuation">)</span>
rect<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> pts<span class="token punctuation">[</span>np<span class="token punctuation">.</span>argmin<span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">]</span>	<span class="token comment"># 即pts[1]</span>
rect<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> pts<span class="token punctuation">[</span>np<span class="token punctuation">.</span>argmax<span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">]</span>	<span class="token comment"># 即pts[3]</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"第一次rect : \n"</span><span class="token punctuation">,</span>rect<span class="token punctuation">)</span>
<span class="token comment"># 计算右上和左下</span>
diff <span class="token operator">=</span> np<span class="token punctuation">.</span>diff<span class="token punctuation">(</span>pts<span class="token punctuation">,</span> axis <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span>	<span class="token comment"># 沿着指定轴计算第N维的离散差值</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"diff : \n"</span><span class="token punctuation">,</span>diff<span class="token punctuation">)</span>
rect<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> pts<span class="token punctuation">[</span>np<span class="token punctuation">.</span>argmin<span class="token punctuation">(</span>diff<span class="token punctuation">)</span><span class="token punctuation">]</span>	<span class="token comment"># 即pts[0]</span>
rect<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> pts<span class="token punctuation">[</span>np<span class="token punctuation">.</span>argmax<span class="token punctuation">(</span>diff<span class="token punctuation">)</span><span class="token punctuation">]</span>	<span class="token comment"># 即pts[2]</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"第二次rect :\n "</span><span class="token punctuation">,</span>rect<span class="token punctuation">)</span>
<span class="token keyword">return</span> rect

def four_point_transform(image, pts):
# 获取输入坐标点
rect = order_points(pts)
(A, B, C, D) = rect
# (tl, tr, br, bl) = rect

<span class="token comment"># 计算输入的w和h值</span>
w1 <span class="token operator">=</span> np<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>C<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> D<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>C<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> D<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
w2 <span class="token operator">=</span> np<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>B<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> A<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>B<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> A<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
w <span class="token operator">=</span> <span class="token builtin">max</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>w1<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>w2<span class="token punctuation">)</span><span class="token punctuation">)</span>

h1 <span class="token operator">=</span> np<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>B<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> C<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>B<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> C<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
h2 <span class="token operator">=</span> np<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>A<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> D<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>A<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> D<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
h <span class="token operator">=</span> <span class="token builtin">max</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>h1<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>h2<span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token comment"># 变换后对应坐标位置</span>
dst <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span><span class="token punctuation">[</span>	<span class="token comment"># 目标点</span>
	<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
	<span class="token punctuation">[</span>w <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span>	<span class="token comment"># 防止出错,-1</span>
	<span class="token punctuation">[</span>w <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> h <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
	<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> h <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dtype <span class="token operator">=</span> <span class="token string">"float32"</span><span class="token punctuation">)</span>

<span class="token comment"># 计算变换矩阵	(平移+旋转+翻转),其中</span>
M <span class="token operator">=</span> cv2<span class="token punctuation">.</span>getPerspectiveTransform<span class="token punctuation">(</span>rect<span class="token punctuation">,</span> dst<span class="token punctuation">)</span>	<span class="token comment"># (原坐标,目标坐标)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>M<span class="token punctuation">,</span>M<span class="token punctuation">.</span>shape<span class="token punctuation">)</span>
warped <span class="token operator">=</span> cv2<span class="token punctuation">.</span>warpPerspective<span class="token punctuation">(</span>image<span class="token punctuation">,</span> M<span class="token punctuation">,</span> <span class="token punctuation">(</span>w<span class="token punctuation">,</span> h<span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token comment"># 返回变换后结果</span>
<span class="token keyword">return</span> warped
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

在这里插入图片描述

注:

  • Line 7-19:左上,右上,右下,左下的坐标顺序调整
    在这里插入图片描述
    在这里插入图片描述

  • Line 27-34,44:计算变换后的w和h,以及cv2.getPerspectiveTransform的原理如下
    在这里插入图片描述

四、OCR识别

window上安装tesseract

# https://digi.bib.uni-mannheim.de/tesseract/
# 配置环境变量如E:\Program Files (x86)\Tesseract-OCR
# tesseract -v进行测试
# tesseract XXX.png 得到结果

 
 
 
 
  • 1
  • 2
  • 3
  • 4

在用户变量和系统变量的path中,都新增一个tesseract的路径,如D:\Program Files (x86)\Tesseract-OCR
在这里插入图片描述
在这里插入图片描述
设置完毕,测试成功
在这里插入图片描述
但 tesseract opencv.png cv 的时候,有可能出现以下错误

Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract.

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

解决方法:
在系统变量中新增一个变量TESSDATA_PREFIX,使该变量的值为 D:\Program Files (x86)\Tesseract-OCR\tessdata 该路径值

再次测试 OK!
tesseract 测试图像 输出(自动输出到txt文件中,因此不用另加 .txt)
在这里插入图片描述
在这里插入图片描述

python中使用tesseract

安装

# pip install pytesseract

 
 
 
 
  • 1

测试

python test.py

 
 
 
 
  • 1

测试test.py中遇到以下两个错误

  1. pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in your PATH. See README file for more information.
    解决方法:
    修改pytesseract.py中的tesseract_cmd指向的路径
    tesseract_cmd = r’D:\Program Files (x86)\Tesseract-OCR\tesseract.exe’

  2. pytesseract.pytesseract.TesseractError: (1, ‘Error opening data file \Program Files (x86)\Tesseract-OCR\eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set
    to your “tessdata” directory. Failed loading language ‘eng’ Tesseract couldn’t load any languages! Could not initialize tesseract.’)
    解决方法:
    还是在系统变量中新增一个变量TESSDATA_PREFIX,使该变量的值为 D:\Program Files (x86)\Tesseract-OCR\tessdata 该路径值

重启后才OK
在这里插入图片描述

该段参考链接:https://blog.csdn.net/qq756684177/article/details/81518891

  1. 什么是OCR?   
    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
    如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。

  2. 什么是Tesseract   
    Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生-
    2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。Tesseract目前已作为开源项目发布在Google Project,其项目主页在这里查看,其最新版本3.0已经支持中文OCR,并提供了一个命令行工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV计算机视觉实战 - 文档扫描OCR识别【项目实战】 的相关文章

  • 如何将k4a_image_t转换为opencv矩阵? (Azure Kinect 传感器 SDK)

    我开始尝试使用 Azure Kinect Sensor SDK 我经历了官方操作指南 https learn microsoft com en us azure Kinect dk about sensor sdk sensor sdk 我
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh
  • 将向量 转换为大小为 (n x 3) 的 Mat,反之亦然

    我有 Point3d 向量 向量形式的点云 如果我使用 OpenCV 提供的转换 比如 cv Mat tmpMat cv Mat pts Here pts is vector
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • OpenCV 2.4 Jpeg 到 PNG(带 alpha 通道)

    我有一个 JPEG 和一个蒙版 我想创建一个具有三个 JPEG 通道的 PNG 并且 Alpha 通道应该是蒙版 如何使用 OpenCV 实现这一目标 Regards std vector
  • OpenCv 与 Android studio 1.3+ 使用新的 gradle - 未定义的参考

    我在使用原生 OpenCv 2 4 11 3 0 0 也可以 和 Android Studio 1 3 以及新的 ndk 支持时遇到问题 所有关于 mk 文件的教程 但我想将它与新的实验性 gradle 一起使用 使用 Kiran 答案An
  • 寻找两个框架之间的变换

    我有来自视频源的两个连续帧 并且我使用 FAST 算法检测这两个帧的关键点 我使用平方差之和法 SSD 来匹配关键点 所以基本上我已经匹配了两个框架之间的关键点 现在我想根据匹配的关键点集计算两个帧之间的仿射变换 缩放 旋转 平移 我知道如
  • opencv - 在图像中绘制轮廓

    我正在尝试在图像周围绘制轮廓 我可以看到找到了轮廓 但无法绘制轮廓 轮廓的颜色似乎是两种 黑色和白色 颜色中的一种 import cv2 import numpy as np import matplotlib pyplot as plt
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 体系结构 x86_64 的未定义符号:用于 caffe 构建

    我收到此错误的原因是caffe http caffe berkeleyvision org 建造 我该如何修复它 我使用的是 Mac OSX Yosemite 10 10 1 控制台日志 Machida no MacBook Air caf
  • 我可以将 OpenCV 的发布配置与我的应用程序的调试配置一起使用吗?

    我正在编写一个通用 Windows 应用程序 它使用 OpenCV 进行相机校准和标签检测等 我希望能够在我自己的 DLL 处于调试模式时使用发布模式 完全优化的 OpenCV DLL 这可能吗 如果是这样 我如何配置 CMake 来实现它
  • python求边数

    我使用下面的代码来查找图像中的边数 但它没有给出适当的结果 导入CV2 image cv2 imread sheet jpg gray cv2 cvtColor image cv2 COLOR BGR2GRAY thresh cv2 thr
  • python cv2.Videocapture() 不起作用,cap.isOpened() 返回 false

    cv2 Videocapture 在使用网络摄像头时工作正常 但在尝试从硬盘驱动器读取时显示错误 cap isOpened 返回 false import cv2 import numpy as np background cv2 imre
  • OpenCV argc 和 argv 混淆

    我正在检查一些 OpenCV 教程 并在开头找到了这一行 这是链接 代码位于 CalcHist 部分下http opencv willowgarage com documentation c histograms html http ope
  • 使用 openCV 检测 ROI

    我正在做一项工作 我必须找到感兴趣的区域 ROI 然后对图像执行阈值 由于我不是计算机领域的 所以我遇到了一些困难 我开始尝试通过以下代码找到投资回报率 code string filename 2011 06 11 09 3A12 3A1
  • 如何在 Keras Lambda Layer 中使用 OpenCV 函数?

    我正在尝试使用一个在图像上使用某些 OpenCV 函数的函数 但我得到的数据是张量 我无法将其转换为图像 def image func img img cv2 cvtColor img cv2 COLOR BGR2YUV img cv2 r
  • 将浮点数组图像转换为可用于 opencv 的格式

    我想知道是否有一种简单的方法可以将浮点数组图像转换为 iplimage 可以用opencv来处理 当然 我可以创建一个具有相同大小的空 iplimage 然后将浮点数组图像中的每个像素复制到空 iplimage 但是是否有更优雅的解决方案
  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra

随机推荐

  • 【电力电子技术】全桥 半桥 推挽 双管正激 DC-DC

    BUCK BOOST BUCK BOOST CUK SEPIC ZETA 二象限 四象限 多重多相DCDC FLYBACK FORWARD 全桥 半桥 推挽 双管正激 DC DC CURRENT DOUBLER
  • IEEE-754 64位双精度浮点数存储详解

    IEEE 754双精度浮点数 IEEE二进制浮点数算术标准 IEEE 754 规定了四种表示浮点数值的方式 单精确度 32位 双精确度 64位 延伸单精确度 43比特以上 很少使用 与延伸双精确度 79比特以上 通常以80位实现 本文介绍6
  • 干货!小白入门Python数据科学全教程 Python大数据分析

    本文讲解了从零开始学习Python数据科学的全过程 涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话 我是一名数据工程师 在用SAS做分析超过5年后 决定走出舒
  • Python中去掉字符串空格的方法有哪些?

    在Python中 当我们使用Python处理字符串时 经常会遇到字符串中包含空格的情况 那么Python如何去掉字符串空格 有多种方法可以从Python字符串中删除空格 以下是详细内容介绍 1 使用strip 方法 它是一个Python内置
  • KeyError: ‘Transformer/...query\\kernel is not a file in the archive‘,已解决。

    在跑TransUNet时 遇到很多报错 前面的都是一些版本不对应问题 然后遇到了这个源码还未完善的小bug 这个错误主要由字符串地址拼接时Windows和Linux等其他系统不太一样 Windows使用 符号 所以找到字符串拼接的地方加上
  • linux中 .zip .gz .tar 的差别及解压缩命令

    一 Linux下最常用的压缩文件就是 tar了 使用tar程序打出来的包我们常称为tar包 对于tar包 可以再用gz zip等压缩算法再次压缩 比如 jdk 8u181 linux x64 tar gz 二 解压缩命令 tar 可以保留原
  • pe模式下修复usb驱动_伺服驱动器三种控制模式的接线

    我们在平时控制伺服电机的时候 经常用到的控制模式就是三种模式分别是速度控制模式 位置控制模式 转矩控制模式 现以三菱的伺服驱动器为例 下面分别了解一下每个模式的控制接线及其注意事项 一 速度控制模式 注 1 为了防止触电 请务必将伺服放大器
  • python高级培训第五次任务

    使用定时器实现当前时间每秒循环输出一次 import threading import time def run print time strftime Y m d H M S time localtime time time t thre
  • 仿微信实现ListView长按删除

    简言 仿微信做了一个对话列表 长按每个列表项弹出popupwindow进行删除操作 最终效果如下 第一步 制作列表界面 可以是ListView 也可以是RecyclerView 布局大家可以自己设计 本文采用的是ListView 第二步 为
  • blockly

    学习自定义块 视频学习 https developers google com blockly guides create custom blocks blockly developer tools hl zh cn 自定义地址 https
  • 作为一个C++新手,我感兴趣的C++开源项目

    2023年4月30日 周日晚上 昨天完成了一个C 项目后 想再开始一个C 项目 但不知道做什么 于是决定看看有什么好的C 开源项目 今晚在网上逛了一圈后 发现了好多有趣的C 开源项目 参考文章 GitHub Top 10 C 优质开源项目
  • SQLServer连接Pgsql或mysql读写数据

    问题 想把SQLServer的数据库迁移到PgSql里面 因为两个数据库业务表的结构和字段都不一样 需要逐表进行按需抽取想要的字段并导入数据 解决方案 可以在SqlServer里面创建链接服务器 链接到Pgsql的表 然后在SQLServe
  • 如何在Anaconda安装Pygame

    开始之前 先来安装Pygame 可使用pip模块来帮助下载安装python包 要安装Pygame 需在终端提示符下执行如下命令 python m pip install user pygame 对于下载了anaconda用户 可按以下操作
  • cisp-pte考试复盘及常考题型总结

    一 选择题 说基础也不基础 pte的题都是偏实践的那一类 感觉也不算简单 不好好看看还真容易栽这上面 那就太可惜了 比如 DMZ区 php伪协议 谷歌命令 00截断中对php版本的要求等等类似的 二 大题 1 sql注入 1 碎碎念 第一题
  • R语言系统教程(八):绘图命令

    R语言系统教程 八 绘图命令 8 1 高水平绘图函数 8 1 1 plot 函数 8 1 2 显示多变量数据 8 1 3 显示图形 8 2 高水平绘图中的命令 8 2 1 图中的逻辑命令 8 2 2 数据取对数 8 2 3 type 8 2
  • CORS跨域资源共享/一些非同源解决方法

    定义 向不同服务器发送请求 在另一要被访问的服务器端可以这么写 拦截所有请求 app use req res next gt 1 允许哪些客户端访问我 代表允许所有的客户端访问我 注意 如果跨域请求中涉及到cookie信息传递 值不可以为
  • 计算机网络基本概念

    互联网的两个重要基本特点 连通性和共享 计算机网络 由若干结点和连接这些结点的链路组成 网络之间可以通过路由连接起来 构成一个覆盖范围更大的网络 称为互连网 也称为 网络的网络 网络把许多计算机连接在一起 而互连网则把许多网络通过路由器连接
  • SecureCRT常用命令

    常用命令 一 ls 只列出文件名 相当于dir dir也可以使用 A 列出所有文件 包含隐藏文件 l 列表形式 包含文件的绝大部分属性 R 递归显示 help 此命令的帮助 二 cd 改变目录 cd 进入根目录 cd 回到自己的目录 用户不
  • 【HTML、CSS】使用HTML、CSS实现动态爱心

    HTML部分源码 div class box div
  • OpenCV计算机视觉实战 - 文档扫描OCR识别【项目实战】

    纸上得来终觉浅 绝知此事要躬行 B站视频 新课件 https pan baidu com s 1frWHqCVGR2VTn5QBtW4lPA 提取码 xh02 老课件 https pan baidu com s 1Wi31FxSPBqWiu