ubuntu14.04 PCL1.8 OPENNI2.0 OPENCV3.0安装小结

简介:    最近入手NvidiaTegra 1 开发板,ARM架构的,做室内三维重建用。今天就讲讲的PCL 1.8+ OPENCV3.1 + OPENNI2.0在ubuntu14.04 上的安装与编译。

   最近入手NvidiaTegra 1 开发板,ARM架构的,做室内三维重建用。今天就讲讲的PCL 1.8+ OPENCV3.1 + OPENNI2.0在ubuntu14.04 上的安装与编译。

   更新ubuntu的armhf源,修改source.list,中科大的快!

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-backports main restricted universe multiverse

一、  Opencv

这个网上有很多教程,

1. 安装依赖包和预备环境

$sudo apt-get install build-essential
$sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

2.从官网下载opencv3.1源码,并解压



3.创建编译目录,编译

$cd ~/opencv-3.1.0
$mkdir release
$cd release
$cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
$make
$sudo make install

4.测试opencv

$mkdir ~/opencv-lena
$cd ~/opencv-lena
$gedit DisplayImage.cpp

#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv )
{
  if ( argc != 2 )
  {
    printf("usage: DisplayImage.out <Image_Path>\n");
    return -1;
  }
  Mat image;
  image = imread( argv[1], 1 );
  if ( !image.data )
  {
    printf("No image data \n");
    return -1;
  }
  namedWindow("Display Image", WINDOW_AUTOSIZE );
  imshow("Display Image", image);
  waitKey(0);
  return 0;
}

创建cmakelist编译文件

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

执行:

$cd ~/opencv-lena
$cmake .
$make

$./DisplayImage lena.jpg


至此opencv配置完毕

 

二、openni2.0

以下内容是我在youtube上看到的视频:

https://www.youtube.com/watch?v=Bn9WqbYtNBw

 

1.安装 OpenNI2依赖项

$sudo apt-get install -y g++ python libusb-1.0-0-dev freeglut3-dev doxygen graphviz
$sudo apt-get install libudev-dev

2.从github将openni2源码clone下来

$git clone https://github.com/occipital/OpenNI2.git
$cd OpenNI2

3.修改两处配置Platform.Arm和CommonCppMakefile,适用于arm设备

$gedit ThirdParty/PSCommon/BuildSystem/Platform.Arm

Change:

CFLAGS+= -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp#-mcpu=cortex-a8

to:

CFLAGS+= -march=armv7-a -mtune=cortex-a15 -mfpu=neon-vfpv4 -mfloat-abi=hard


$gedit ThirdParty/PSCommon/BuildSystem/CommonCppMakefile

---OpenNI2-2.2.0.30/ThirdParty/PSCommon/BuildSystem/CommonCppMakefile.old2014-03-28 19:09:11.572263107 -0700

+++OpenNI2-2.2.0.30/ThirdParty/PSCommon/BuildSystem/CommonCppMakefile 2014-03-2819:09:55.600261937 -0700

@@-95,6 +95,9 @@

OUTPUT_NAME= $(EXE_NAME)

# Wewant the executables to look for the .so's locally first:

LDFLAGS+= -Wl,-rpath ./

+ifneq ("$(OSTYPE)","Darwin")

+LDFLAGS += -lpthread

+endif

OUTPUT_COMMAND= $(CXX) -o $(OUTPUT_FILE) $(OBJ_FILES) $(LDFLAGS)

endif

ifneq "$(SLIB_NAME)" ""



4.修改makefile,增加sample,即在makefile文件末尾添加:

core_samples: $(CORE_SAMPLES)
tools: $(ALL_TOOLS)


5.编译

$make
$make core_samples # this probably isn't necessary, they should already be built
$GLUT_SUPPORTED=1 make tools#GLUT_SUPPORTED tells the make to compile NiViewer for OpenGL

6.安装libfreenect,否则无法驱动primesensor

安装依赖项

$sudo apt-get install cmake freeglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev –y

下载源码并编译

$ git clone git://github.com/OpenKinect/libfreenect.git
$ cd libfreenect
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
# Build the OpenNI2 driver
$ cmake .. -DBUILD_OPENNI2_DRIVER=ON
$ make

将libfreenect的so拷贝到OpenNI的驱动文件夹下

$ Repository=../../Bin/Arm-Release/OpenNI2/Drivers
$ cp -L lib/OpenNI2-FreenectDriver/libFreenectDriver* ${Repository}

设置使用传感器的权限

$ sudo usermod -a -G video Ubuntu

7. 回到 openni2 目录,将头文件和 so 文件拷贝到 /usr 目录下

$ sudo cp -r Include /usr/include/openni2
$ sudo cp -r Bin/Arm-Release/OpenNI2 /usr/lib/
$ sudo cp Bin/Arm-Release/libOpenNI2.* /usr/lib/

8. 创建 packageconfig 文件

# this will enable ubuntu to find the location of the drivers, libraries and include files.
$ sudo gedit /usr/lib/pkgconfig/libopenni2.pc

and fill it with this:

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/openni2

Name: OpenNI2
Description: A general purpose driver for all OpenNI cameras.
Version: 2.2.0.0
Cflags: -I${includedir}
Libs: -L${libdir} -lOpenNI2 -L${libdir}/OpenNI2/Drivers -lDummyDevice -lOniFile -lPS1080.so

检验:

# To make sure it is correctly found, run
$ pkg-config --modversion libopenni2

# which should give the same version as defined in the file above (2.2.0.0)

最后一步:

# Linux has used the udev system to handle devices such as USB connected peripherals.

$ cd Packaging/Linux
$ sudo cp primesense-usb.rules /etc/udev/rules.d/557-primesense-usb.rules

翻译的如果卡不懂和其他注意事项,

请直接看:http://jetsonhacks.com/2014/08/28/building-openni2-structure-sensor/

运行结果:






三、PCL安装

参考:

http://larrylisky.com/2014/03/03/installing-pcl-on-ubuntu/

安装依赖环境

sudo apt-get install g++
sudo apt-get install cmake cmake-gui
sudo apt-get install doxygen  
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common  
sudo apt-get install libflann1 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk5.8-qt4 libvtk5.8 libvtk5-dev
sudo apt-get install libqhull*
sudo apt-get install libusb-dev
sudo apt-get install libgtest-dev
sudo apt-get install git-core freeglut3-dev pkg-config
sudo apt-get install build-essential libxmu-dev libxi-dev 
sudo apt-get install libusb-1.0-0-dev graphviz mono-complete
sudo apt-get install qt-sdk openjdk-7-jdk openjdk-7-jre
sudo apt-get install phonon-backend-gstreamer
sudo apt-get install phonon-backend-vlc

从github上下载pcl最新版本并编译

$git clone https://github.com/PointCloudLibrary/pcl.git pcl-trunk ln -s pcl-trunk pcl(我是直接下载了压缩包,解压的,不然太慢了)
$mkdir release
$cd release
$cmake -DCMAKE_BUILD_TYPE=None -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON ..
$make
$sudo make install

至此完成安装,但是是VTK有问题的,留着下次解决---->这么解决:

大家如何cmake时,发现有类似The imported target "vtk***" reference the file "/usr/bin/vtk**"的错误,需要安装如下两个东西:

sudo apt-get install libvtk-java
sudo apt-get install python-vtk

然后再重新编译,时间非常久

cmake -DCMAKE_BUILD_TYPE=None -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON ..
make
make install

编译完成后,执行他的pcd_viewer,结果如下:


#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
using namespace std;
using namespace pcl;
    
int main ()
{
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);

	if(pcl::io::loadPCDFile<pcl::PointXYZRGB>("color_5.pcd",*cloud)==-1)//*打开点云文件
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd\n");
		return(-1);
	}
	std::cout<<"Loaded "<<cloud->width*cloud->height<<" data points from test_pcd.pcd with the following fields: "<<std::endl;

	pcl::visualization::CloudViewer viewer("My First Cloud Viewer");
	viewer.showCloud(cloud);
	while(!viewer.wasStopped())
	{

	}
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(cloud_viewer)

find_package(PCL 1.8 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (cloud_viewer test.cpp)
target_link_libraries (cloud_viewer ${PCL_LIBRARIES})



四、最后再给出三个库同时使用的情形:

CMakeLists.txt

# This CmakeLists include both OpenNI and OpenCV Libraries
cmake_minimum_required(VERSION 2.8)
project( TestOpenNI )


# OpenCV
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
MESSAGE(STATUS "The Opencv's include directory is:" ${OpenCV_INCLUDE_DIRS})

#OpenNI
FIND_PATH(OpenNI2_INCLUDE_DIRS OpenNI.h HINTS  $ENV{OPENNI2_INCLUDE} PATH_SUFFIXES openni2)
FIND_LIBRARY(OpenNI2_LIBRARY NAMES OpenNI2 HINTS  $ENV{OPENNI2_LIB} $ENV{OPENNI2_REDIST})
include_directories( ${OpenNI2_INCLUDE_DIRS} )


IF (OpenNI2_INCLUDE_DIRS AND OpenNI2_LIBRARY)
   SET(OpenNI2_FOUND TRUE)
ENDIF (OpenNI2_INCLUDE_DIRS AND OpenNI2_LIBRARY)

IF (OpenNI2_FOUND)
   # show which OpenNI2 was found only if not quiet
   SET(OpenNI2_LIBRARIES ${OpenNI2_LIBRARY})
   MESSAGE(STATUS "Found OpenNI2: ${OpenNI2_LIBRARIES}")
ELSE (OpenNI2_FOUND)
   # fatal error if OpenNI2 is required but not found
   IF (OpenNI2_FIND_REQUIRED)
      MESSAGE(FATAL_ERROR "Could not find OpenNI2. Environment variables OPENNI2_INCLUDE (directory containing OpenNI.h) and OPENNI2_LIB (directory containing OpenNI2 library) could bet set.")
   ENDIF (OpenNI2_FIND_REQUIRED)
ENDIF (OpenNI2_FOUND)

#set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#set (OPENNI_H /usr/include/openni2/OpenNI.h)
# ---------------------------------------------------------

#PCL
find_package(PCL 1.8 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(TestOpenNI test.cpp)
target_link_libraries(TestOpenNI ${OpenNI2_LIBRARIES} ${OpenCV_LIBS} ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})

c++文件:


#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
// 标准库头文件
#include <iostream>
#include <string>
#include <vector> 
// OpenCV头文件
#include <opencv2/photo.hpp>
#include <opencv2/highgui.hpp> 
// OpenNI头文件
#include <OpenNI.h> 
typedef unsigned char uint8_t;
// namespace
using namespace std;
using namespace openni;
using namespace cv;
using namespace pcl;

void CheckOpenNIError( Status result, string status )  
{   
    if( result != STATUS_OK )   
        cerr << status << " Error: " << OpenNI::getExtendedError() << endl;  
} 

int main( int argc, char **argv )
{
	Status result = STATUS_OK;
	int i,j;
	float x=0.0,y=0.0,z=0.0,xx=0.0;  
	//IplImage *test,*test2;
	IplImage *test2;
	char filename[20] = {0};

	//point cloud 
	PointCloud<PointXYZ> cloud;
	PointCloud<PointXYZRGB> color_cloud;

	//opencv image
	Mat cvBGRImg; 
	Mat cvDepthImg;  

	//OpenNI2 image  
    VideoFrameRef oniDepthImg;  
    VideoFrameRef oniColorImg;

	namedWindow("depth");  
    namedWindow("image"); 

	char key=0;

	// 初始化OpenNI  
    result = OpenNI::initialize();
	CheckOpenNIError( result, "initialize context" ); 
	
    // open device    
    Device device;  
    result = device.open( openni::ANY_DEVICE ); 
	CheckOpenNIError( result, "open device" );


    // create depth stream   
    VideoStream oniDepthStream;  
    result = oniDepthStream.create( device, openni::SENSOR_DEPTH );
	CheckOpenNIError( result, "create depth stream" );
  
    // set depth video mode  
    VideoMode modeDepth;  
    modeDepth.setResolution( 640, 480 );  
    modeDepth.setFps( 30 );  
    modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );  
    oniDepthStream.setVideoMode(modeDepth);  
    // start depth stream  
    result = oniDepthStream.start(); 
	CheckOpenNIError( result, "start depth stream" );
   
    // create color stream  
    VideoStream oniColorStream;  
    result = oniColorStream.create( device, openni::SENSOR_COLOR );  
	CheckOpenNIError( result, "create color stream" );
    // set color video mode  
    VideoMode modeColor;  
    modeColor.setResolution( 640, 480 );  
    modeColor.setFps( 30 );  
    modeColor.setPixelFormat( PIXEL_FORMAT_RGB888 );  
    oniColorStream.setVideoMode( modeColor); 
	// start color stream  
    result = oniColorStream.start(); 
	CheckOpenNIError( result, "start color stream" );
	
	int count = 0;
	while(true)
	{
		// read frame  
        if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK )  
        {  
            // convert data into OpenCV type  
            Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() );  
            cvtColor( cvRGBImg, cvBGRImg, CV_RGB2BGR );  
            imshow( "image", cvBGRImg );  
        }  

		if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK )  
        {  
            Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() );  
            cvRawImg16U.convertTo( cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));    
            imshow( "depth", cvDepthImg );  
        } 

	char input = waitKey(1); 
		// quit
        if( input == 'q' )      
            break;
		// capture  depth and color data   
        if( input == 'c' )
		{
			//get data
			DepthPixel *pDepth = (DepthPixel*)oniDepthImg.getData();
			//create point cloud
			cloud.width = oniDepthImg.getWidth();
			cloud.height = oniDepthImg.getHeight();
			cloud.is_dense = false;
			cloud.points.resize(cloud.width * cloud.height);
			color_cloud.width = oniDepthImg.getWidth();
			color_cloud.height = oniDepthImg.getHeight();
			color_cloud.is_dense = false;
			color_cloud.points.resize(color_cloud.width * color_cloud.height);

			//test = cvCreateImage(cvSize(cloud.width,cloud.height),IPL_DEPTH_8U,3);
			IplImage temp11 = (IplImage)cvBGRImg;
			//test2 = &IplImage(cvBGRImg);
			test2 = &temp11;			

			for(i=0;i<oniDepthImg.getHeight();i++)
			{
				 for(j=0;j<oniDepthImg.getWidth();j++)
				 {
					 float k = i;  
					 float m = j; 
					 xx = pDepth[i*oniDepthImg.getWidth()+j];
					 CoordinateConverter::convertDepthToWorld (oniDepthStream,m,k,xx,&x,&y,&z); 
					 cloud[i*cloud.width+j].x = x/1000;
					 cloud[i*cloud.width+j].y = y/1000;
					 cloud[i*cloud.width+j].z = z/1000;

					 color_cloud[i*cloud.width+j].x = x/1000;
					 color_cloud[i*cloud.width+j].y = y/1000;
					 color_cloud[i*cloud.width+j].z = z/1000;
					 color_cloud[i*cloud.width+j].b = (uint8_t)test2->imageData[i*test2->widthStep+j*3+0];
					 color_cloud[i*cloud.width+j].g = (uint8_t)test2->imageData[i*test2->widthStep+j*3+1];
					 color_cloud[i*cloud.width+j].r = (uint8_t)test2->imageData[i*test2->widthStep+j*3+2];
					/* test->imageData[i*test->widthStep+j*3+0] = test2->imageData[i*test2->widthStep+j*3+0];
					 test->imageData[i*test->widthStep+j*3+1] = test2->imageData[i*test2->widthStep+j*3+1];
					 test->imageData[i*test->widthStep+j*3+2] = test2->imageData[i*test2->widthStep+j*3+2];*/
				 }
	   		 }
			
			//cvSaveImage("test.jpg",test);
			//pcl::io::savePLYFileBinary("test_plyc.ply",cloud);
			cout<<"the "<<count<<" is saved"<<endl;
			sprintf(filename,"./data/%d.pcd",count);
			pcl::io::savePCDFileBinaryCompressed(filename,cloud);
			cerr<<"Saved "<<cloud.points.size()<<" data points to xyz pcd."<<endl;
			sprintf(filename,"./data/color_%d.pcd",count);
			pcl::io::savePCDFileBinaryCompressed(filename,color_cloud);
			cerr<<"Saved "<<color_cloud.points.size()<<" data points to xyzrgb pcd."<<endl;
			sprintf(filename,"./data/color_%d.jpg",count);
			imwrite(filename,cvBGRImg);
			sprintf(filename,"./data/depth_%d.jpg",count++);
			imwrite(filename,cvDepthImg);
			/*for(size_t i=0;i<cloud.points.size();++i)
			cerr<<"    "<<cloud.points[i].x<<" "<<cloud.points[i].y<<" "<<cloud.points[i].z<<endl;*/
		}
	}
}

运行结果:


键盘输入c抓取数据,按q退出






目录
相关文章
|
19天前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
1505 3
|
13天前
|
Ubuntu Linux 测试技术
Linux系统之Ubuntu安装cockpit管理工具
【10月更文挑战第13天】Linux系统之Ubuntu安装cockpit管理工具
46 4
Linux系统之Ubuntu安装cockpit管理工具
|
18天前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
80 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
18天前
|
Ubuntu Linux C语言
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
本文介绍了在Ubuntu 18.04系统上编译安装OpenCV 3.4.0及其扩展包opencv_contrib 3.4.0的详细步骤,包括下载源码、安装依赖、配置CMake和编译安装,以及常见问题的解决方法。
31 1
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
|
6天前
|
Ubuntu 编译器 计算机视觉
Ubuntu系统编译OpenCV4.8源码
【10月更文挑战第17天】只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;第三步就是编译OpenCV源码包生成安装文件并安装。
25 4
|
14天前
|
Kubernetes Ubuntu Docker
从0开始搞K8S:使用Ubuntu进行安装(环境安装)
通过上述步骤,你已经在Ubuntu上成功搭建了一个基本的Kubernetes单节点集群。这只是开始,Kubernetes的世界广阔且深邃,接下来你可以尝试部署应用、了解Kubernetes的高级概念如Services、Deployments、Ingress等,以及探索如何利用Helm等工具进行应用管理,逐步提升你的Kubernetes技能树。记住,实践是最好的老师,不断实验与学习,你将逐渐掌握这一强大的容器编排技术。
39 1
|
18天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
161 3
|
18天前
|
Ubuntu Linux
软件安装(五):Ubuntu 18.04安装Teamviewer 看一遍就会
这篇文章介绍了在Ubuntu 18.04系统上通过图形界面和命令行两种方法安装TeamViewer远程控制软件的步骤。
20 2
|
6天前
|
Ubuntu Linux
Ubuntu 16.04下无法安装.deb的解决方法
希望以上策略能有效协助您克服在Ubuntu 16.04中安装.deb文件时遇到的挑战。
8 0
|
19天前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
173 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解