基于opencv的4A纸提取显示,会找到图片中最大的四边形并提取和变换为A4纸比例后输出,需要自行配置opencv
2025-07-31 21:54:27 6KB opencv
1
项目细节: 首先载入源图像,并进行尺寸预处理。 载入源图像image并作拷贝为org,将image按原始h,w的比例大小设置为高度为500的图像。 进行边缘检测和轮廓检测 在灰度化->边缘检测->轮廓检测后,将轮廓按轮廓的面积进行排序(注意这里默认是顺序的即从小到大,我们需要从大到小排序,所以reverse = True),取面积最大的前5个轮廓,并用多边形逼近(cv.approxPolyDP)的方法将轮廓近似出来,因为检测的轮廓有圆形有长矩形,我们需要的检测的目标轮廓是四边形(类似于矩形)。所以我们经过筛选得到我们需要的四边形的坐标。 坐标的透视变换 由多边形逼近轮廓的方法得到的坐标 是每个轮廓逆时钟方向的各个顶点的坐标,而我们想要顺时针方向的各个顶点的坐标,所以需要先对轮廓坐标重新排序。接着需要求出四边形轮廓的高和宽,来创建一个dst数组:该数组为[[0,0],[width-1,0],[width-1,height-1],[0,height-1] 。将四边形轮廓坐标和dst输入到cv.getPerspectiveTransform 函数里,得到透视变换的M矩阵。接着将用M矩阵对原图像做透视变化,其中得出的warped的大小为(width,height),这样透视变换就做完了。 简单点说:首先读取两个坐标数组,计算变换矩阵;然后根据变换矩阵对原图进行透视变换,并输出到目标画布, OCR识别 在OCR识别之前要对待识别的图像进行预处理,即灰度二值化,接着利用ocr指令来识别。 源码: import cv2 as cv import numpy as np import pytesseract def order_point(pts): rect = np.zeros((4, 2), dtype = "float32") s = pts.sum(axis = 1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)] diff = np.diff(pts,axis=1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)] return rect def four_point_transfer(image,pts): rect = order_point(pts) (tl,tr,br,bl) = rect width1 = np.sqrt((tr[0]-tl[0])*(tr[0]-tl[0])+(tr[1]-tl[1])*(tr[1]-tl[1])) width2 = np.sqrt((br[0]-bl[0])*(br[0]-bl[0])+(br[1]-bl[1])*(br[1]-bl[1])) width = max(width1,width2) #python中有max函数和np.max函数,前者是比较两个数值的大小取最大值,后者是取出数组的最大值 height1 = np.sqrt((tr[0]-br[0])*(tr[0]-br[0])+(tr[1]-br[1])*(tr[1]-br[1])) height2 = np.sqrt((tl[0]-bl[0])*(tl[0]-bl[0])+(tl[1]-bl[1])*(tl[1]-bl[1])) height = max(height1,height2) dst = np.array([[0,0],[width-1,0],[width-1,height-1],[0,height-1]],dtype="float32") M = cv.getPerspectiveTransform(rect,dst) warped =cv.warpPerspective(image,M,(width,height)) return warped def resize(image,height=None): if height is None: return image else : h,w= image.shape[:2] #shape:h,w,channel image[h(row),w(col),channel] r = height/h width = int(w*r) #关于size函数参数的一般是(宽,高) image = cv.resize(image,(width,height),interpolation=cv.INTER_AREA) #还有resize(img,(宽,高)),即先列后行 return image #利用cv.bounding()得到x,y,width,height #其它情况一般都是先行后列(高,宽) #如shape得到参数,或者roi区域内部参数,建立新的Mat 都是先行后列 image = cv.imread("E:\opencv\picture\page.jpg") orig = image.copy() image = resize(image,height=500) ratio = orig.shape[0]/500 #边缘检测 image_gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) image_gray = cv.GaussianBlur(image_gray,(5,5),0) image_edge = cv.Canny(image_gray,75,200) #轮廓检测 image_contours = cv.findContours(image_edge.copy(),cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)[1] countours = sorted(image_contours,key=cv.contourArea,reverse=True)[:5] for c in countours: arc = cv.arcLength(c,closed=True) approx = cv.approxPolyDP(c,arc*0.02,True) if len(approx) == 4: screen_shot = approx break cv.drawContours(image,[screen_shot],-1,(0,0,255),2) warped =four_point_transfer(orig,screen_shot.reshape(4,2)*ratio) cv.imshow('warped_window',resize(warped,height=650)) warped =cv.cvtColor(warped,cv.COLOR_BGR2GRAY) scan = cv.threshold(warped,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)[1] cv.imwrite("E:/opencv/picture/scan.png",scan) cv.imshow("scan ",scan) scanstring = pytesseract.image_to_string(scan) print(scanstring) cv.waitKey(0) cv.destroyAllWindows() 在这个图像处理案例中,主要涉及了以下几个关键技术点: 1. 图像预处理: - **图像尺寸预处理**:通过`resize`函数调整图像尺寸,确保图像高度为500像素,保持原图像的宽高比例。这一步骤是为了统一处理不同大小的图像,使其适应后续的处理算法。 - **灰度化**:使用`cv.cvtColor`函数将彩色图像转换为灰度图像,简化图像特征,便于边缘检测和轮廓识别。 - **边缘检测**:采用Canny算法`cv.Canny`进行边缘检测,识别图像中的边界,帮助分离文字区域。 2. 轮廓检测与筛选: - **轮廓检测**:使用`cv.findContours`找出图像中的所有轮廓,`cv.RETR_LIST`确保获取所有独立的轮廓,`cv.CHAIN_APPROX_SIMPLE`压缩轮廓信息以节省内存。 - **轮廓排序与筛选**:按照轮廓面积进行降序排序,选择前五个最大的轮廓,这是因为文字区域通常比背景区域的面积更大。通过`cv.approxPolyDP`进行多边形逼近,去除非四边形轮廓,保留类似矩形的四边形轮廓,以精确选取文本区域。 3. 坐标变换与透视变换: - **坐标排序**:将轮廓坐标按照顺时针方向重新排序,这是为了满足`cv.getPerspectiveTransform`函数的需要,它需要按顺序的顶点坐标。 - **创建dst数组**:dst数组定义了目标四边形的四个顶点,即一个标准的矩形。 - **计算透视变换矩阵**:利用`cv.getPerspectiveTransform`得到将四边形轮廓坐标转换为dst矩形的透视变换矩阵`M`。 - **执行透视变换**:通过`cv.warpPerspective`函数,应用M矩阵对原图像进行透视变换,生成warped图像,使文字区域变为标准矩形。 4. OCR识别: - **预处理**:将warped图像转为灰度图像并进行二值化,使用`cv.threshold`和`cv.THRESH_BINARY|cv.THRESH_OTSU`进行自动阈值设定,提高文字识别的准确性。 - **OCR识别**:使用`pytesseract.image_to_string`对二值化后的图像进行文字识别,将图像转换为可读的文本字符串。 总结来说,这个案例展示了如何通过OpenCV库进行图像处理,包括尺寸调整、边缘检测、轮廓识别、坐标变换以及最终的OCR文字识别。这些步骤是图像分析和自动化文本提取的关键技术,常用于文档扫描、图像识别和信息提取等领域。
2025-07-30 21:48:04 21KB opencv python ocr
1
区域道具 Regionprops是Matlab提供的regionprops的C ++版本。 要求 Regionprops需要以下软件包才能构建: OpenCV(<3> > contours; std::vector hierarchy; cv::findContours (bin, contours, hierar
2025-07-30 13:45:59 124KB opencv c-plus-plus computer-vision
1
centos上傻瓜式安装。 解压后cd进入opencv文件夹后,sudo sh opencv.sh 。 跑完后会在opencv-4.7.0/build/bin/文件夹下出现opencv-470.jar,同时将最关键的libopencv_java470.so放进系统路径。 可以跑下附带的hello.java,看看是否编译成功: javac -cp opencv-4.7.0/build/bin/opencv-470.jar hello.java java -cp .:opencv-4.7.0/build/bin/opencv-470.jar hello
2025-07-30 11:06:17 91.53MB opencv 安装脚本
1
OpenCV(开源计算机视觉库)中的DNN(Deep Neural Network)模块是用于处理深度学习模型的强大工具,它支持TensorFlow、Caffe、ONNX等多种框架训练的模型。本压缩包文件"OpenCV_dnn_module"可能包含了使用OpenCV的DNN模块在C++和Python两种编程语言中部署各种网络模型的相关资源。 一、OpenCV DNN模块概述 OpenCV DNN模块允许开发者在CPU和GPU上执行预先训练好的深度学习模型,提供了灵活的接口来加载和运行不同框架的模型。这使得开发者无需深入理解每个框架的细节,就能在OpenCV中利用深度学习功能。 二、网络模型 标题中的“各种网络模型”可能包括但不限于以下常见的深度学习模型: 1. AlexNet:2012年ImageNet竞赛的获胜者,开启了深度学习在计算机视觉领域的广泛应用。 2. VGGNet:由VGG团队提出的深而薄的网络,以其多层卷积结构著名。 3. GoogleNet (Inception):通过Inception模块减少计算量,提高效率。 4. ResNet:通过残差连接解决了深度神经网络的梯度消失问题。 5. DenseNet:引入了密集连接的概念,提高了特征的重用。 6. YOLO (You Only Look Once):实时目标检测系统,速度快且性能优异。 7. SSD (Single Shot MultiBox Detector):另一种高效的目标检测方法,结合了分类和定位任务。 三、OpenCV DNN模块使用 1. 加载模型:使用`cv::dnn::readNetFromXXX()`函数加载模型,XXX可以是TF、Caffe或ONNX等。 2. 模型预处理:调整输入图像大小、归一化、填充等,以满足模型的输入要求。 3. 执行前向传播:调用`net.forward()`执行模型预测。 4. 后处理:根据模型输出进行目标检测、图像分类或其他任务的后处理。 四、C++和Python API OpenCV提供了C++和Python两种API供开发者选择。C++ API通常用于性能敏感的应用,Python API则更易于理解和使用。两者在基本操作上类似,如加载模型、设置输入和获取输出等。 五、示例代码 在C++中,加载预训练的ResNet-50模型进行图像分类可能如下: ```cpp #include <opencv2/dnn.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace cv; using namespace cv::dnn; int main() { // 加载模型 Net net = readNetFromCaffe("path_to_prototxt", "path_to_model"); // 读取图像并预处理 Mat img = imread("path_to_image"); resize(img, img, Size(224, 224)); img.convertTo(img, CV_32F, 1.0 / 255); // 设置网络输入 Mat inputBlob = blobFromImage(img); net.setInput(inputBlob, "data"); // 前向传播 Mat output = net.forward(); // 获取类别预测 float* outputData = output.ptr(0); int maxClassId = max_element(outputData, outputData + output.cols)[0]; return 0; } ``` Python版本的代码大致相同,只需替换相应的函数调用。 六、应用范围 OpenCV DNN模块广泛应用于图像识别、物体检测、人脸识别、图像分割等领域,通过结合其他OpenCV功能,可以实现复杂且高效的计算机视觉解决方案。 "OpenCV_dnn_module"可能包含了OpenCV DNN模块在C++和Python中使用各种深度学习模型的实例、代码或教程,帮助开发者快速上手并利用这些模型进行实际应用。通过深入理解和实践,可以进一步提升计算机视觉项目的性能和效率。
2025-07-27 16:10:05 201.37MB opencv dnn 网络 网络
1
opencv4nodejs_cv4.10.0完整版包含最新版opencv4.10编译包,opencv4nodejs编译包,下载后直接拷贝设置环境变量后就可以直接使用opencv4nodejs进行开发, opencv4nodejs-cv4.10.0完整版是opencv4nodejs的最新版本,包含了opencv4.10的编译包和opencv4nodejs的编译包。这意味着开发者可以直接拷贝使用,无需进行复杂的安装和配置过程。opencv4nodejs是一个基于opencv的nodejs模块,opencv是一个开源的计算机视觉和机器学习软件库,它提供了很多常用的图像处理和识别的算法。 opencv4nodejs的特点是可以直接在nodejs环境中使用opencv,它继承了opencv强大的图像处理和识别能力,同时也保留了nodejs的高效和简洁的特点。这种组合使得开发者可以在服务器端进行高效的图像处理和识别,这对于开发一些需要处理图像和视频的应用非常有用。 opencv4nodejs-cv4.10.0完整版的使用也非常简单,只需要下载后,按照配置说明设置环境变量,就可以直接在nodejs项目中使用opencv4nodejs进行开发。这对于初学者和有经验的开发者都是非常友好的。 opencv4nodejs-cv4.10.0完整版中包含的opencv-4.x(full).zip是opencv的最新编译包,这个包包含了opencv的所有功能模块,开发者可以根据需要选择使用。而package-lock.json和package.json是nodejs项目的依赖管理文件,它们可以确保项目的依赖模块能够正确安装,避免因版本不一致导致的问题。 opencv4nodejs-cv4.10.0完整版是一个非常强大的工具,它为开发者提供了一个高效、简洁的环境,可以让他们更加专注于开发,而不是花费大量时间在配置和安装上。无论你是图像处理的初学者,还是有经验的开发者,都可以从这个版本中获得巨大的帮助。
2025-07-26 10:27:19 29.76MB opencv 人工智能
1
bgslibrary:实现了二十来种视频前景提取的算法,The BGSLibrary was developed by Andrews Sobral and provides a C++ framework to perform background subtraction (BGS). The code works either on Windows or on Linux.
2025-07-24 23:34:48 52.34MB OpenCV
1
根据提供的文件信息,可以提炼出以下知识点: 1. 机器人技术:涵盖了广泛的领域,包括机器人的设计、制造、操作以及应用等方面的知识。 2. ROS系统:ROS(Robot Operating System)是一个灵活的框架,用于构建机器人应用程序。它提供了一系列工具和库,方便用户编写机器人软件,且特别适合于多计算机系统。 3. 树莓派:树莓派是一种单板计算机,以小型、低成本、高灵活性著称。它经常被用于教育和爱好项目中,因其强大且可扩展的特性,非常适合用于构建低成本的机器人原型。 4. 激光雷达:激光雷达(LIDAR)是一种遥感技术,利用激光来测量地球表面的精确距离。在机器人领域,激光雷达被广泛用于环境感知和地图构建。 5. 摄像头:摄像头是机器人视觉系统的重要组成部分,用于捕捉环境图像。在智能小车项目中,摄像头可以提供视觉信息,辅助机器人导航和环境理解。 6. IMU(惯性测量单元):IMU能够提供关于物体的姿态、方向和加速度的测量数据。在机器人技术中,IMU对于导航、定位和运动控制至关重要。 7. OpenCVOpenCV是一个开源的计算机视觉和机器学习软件库。它包含多种图像处理和模式识别功能,对于实现机器人视觉系统尤其重要。 8. 安卓APP:安卓应用程序可以用来与智能小车项目进行交互。通过安卓APP,用户可以远程控制小车,查看摄像头捕获的视频流,接收传感器数据等。 9. SLAM技术:SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)是一种使机器人能在未知环境中导航的技术。它允许机器人在探索新环境的同时建立环境地图,并在其中定位自己。 10. 项目集成:项目集成指的是将各个技术组件如激光雷达、摄像头、IMU、OpenCV等整合在一起,使它们能够协同工作,共同完成特定任务。在本项目中,这包括环境感知、地图构建等功能。 11. raspberrypi-slam-ros-car-master:这可能是项目的主文件夹名称,包含了整个智能小车项目的所有源代码和资源文件。 总结而言,该项目是一个基于ROS的树莓派智能小车集成系统,它集成了多种传感器和软件技术,目的是实现激光雷达环境感知和SLAM地图构建功能,并通过安卓应用远程控制和接收数据。
2025-07-24 13:07:39 46KB
1
Unity2020.3.48f1c1版本
2025-07-23 14:04:53 197.83MB unity opencv
1
dcm4che编译源码失败,由于无法下载该依赖库,导致 dcm4che-imageio-opencv 无法编译成功。
2025-07-22 21:59:31 296KB opencv java
1