自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

On my way

记录学习的过程也是一种快乐

  • 博客(119)
  • 资源 (15)
  • 收藏
  • 关注

原创 OpenCV实战之人脸美颜美型算法

更重要的是,课程中通过需求分析——功能定义——原理设计——编程实战的流程来让你掌握比较复杂的图像算法开发流程剖析与实施的技能,这将会在你后续的科研/项目开发过程中发挥更大的作用。人脸美颜美型是一个综合性较高的算法,包括基于机器学习的人脸与关键点检测,与常见传统图像处理方法,如图像滤波,图像融合,形态学操作、图像变形等。鉴于此,笔者设计了一套基于OpenCV实现的一套比较完整的人脸美颜美型算法,实现包括磨皮、美白、大眼、瘦脸、下巴收放、瘦鼻等功能,算法效果如下几张动图所示。

2022-11-12 15:53:11 4457 8

原创 基于单目相机的标靶三维定位——编程实现

实际运行效果如下图所示,可以观察到标靶坐标系X轴向右,Y轴向下,Z轴向里。当标靶向右移动时,计算得到的X变大,反之变小;接下来实现一个完整的功能函数,以摄像头图像和相机内参为输入,不断计算并显示棋盘格标靶所在坐标系原点相对于相机坐标系的三维坐标;上一章内容中我们描述了基于单目相机实现标靶三维定位的原理,关键步骤为1)计算得到相机的内参和畸变系数;3)计算标靶坐标系到相机坐标系的变换矩阵。首先我们实现一个函数,输入为包含棋盘格的图像,相机内参,输出为标靶坐标系相对于相机坐标系的变换信息,具体实现如下。

2024-04-15 17:49:00 415

原创 基于单目相机的标靶三维定位——原理阐述

我们已知棋盘格标靶的各个角点位于棋盘格坐标系的坐标(单位mm,Z为0),同时通过角点检测可得到它们对应的像素坐标,且已知相机的内参与畸变系数,那么我们可以求解得到标靶坐标系到相机坐标系的变换矩阵Tcw。对于标靶左上角角点,它在标靶坐标系的坐标为Pw(0,0,0),则该角点在相机坐标系下的坐标Pc=Tcw*Pw,即得到了它相对于相机坐标系的三维位置。

2024-04-11 20:34:13 170

原创 普通相机标定——执行与结果验证

作者用的相机分辨率为1280x720,执行程序的输出结果如下,输出信息包括相机的内参与畸变系数,同时将每幅图像的平均重投影误差也打印了出来。在采集了一定量的数据之后,从中挑选10张左右的图像,使得棋盘格在各张图像上具备不同的位姿,且整体上能够覆盖尽量多的视野,如下图所示。如下图所示标定结束后会新增《corner》和《undistorted》文件夹,分别存放成功检测角点的每幅图像的角点绘制结果和对应的使用了标定得到的内参进行畸变校正得到的校正结果,以查看确定角点检测与畸变校正的正确性。

2024-04-08 18:32:05 42

原创 windows平台编译opencv4.9.0

参考网上的一种做法,这里把如下文件中https://raw.githubusercontent.com/开头的下载地址前面都增加“https://mirror.ghproxy.com/”变成“https://mirror.ghproxy.com/https://raw.githubusercontent.com/”开头。然后就会生成OpenCV.sln,使用VS2017打开它,分别在Debug和Release模式下进行编译和安装,编译产物会存放在build/vs2017_x64/install文件夹下。

2024-03-01 16:33:20 312

原创 普通相机标定——核心函数编写

这里我们实现一个校验相机内参标定结果的函数,其原理为利用相机标定得到的外参、内参、畸变系数,将棋盘格角点从世界坐标映射到像素坐标,然后对比上述像素坐标与检测得到的像素坐标的差异。该函数实现利用采集好的标定图像进行相机内参的标定,同时调用上述实现的ComputeReprojectionErrors校验标定结果,实现如下。现在我们已经完成了标定图像的采集,如下图所示;接下来就要完成相机的内参标定了。中已经对它们做了简要介绍,这里不再赘述。

2024-01-26 16:38:37 109

原创 普通相机标定——功能函数编写

如之前章节内容所述,相机内参标定的流程包括1)采集一些包含棋盘格的相机图像,2)检测棋盘格角点,3)标定计算相机内参与畸变系数,4)验证标定精度与效果。本章我们将开始具体的编程开发,首先完成一些功能性函数的实现。注:相关代码在Windows平台运行。

2023-12-29 16:22:36 452

原创 普通相机标定——OpenCV函数讲解(下)

至此OpenCV中有关标定的基础函数基本上介绍完毕,我们后面需要组合使用上述函数完成相关的功能,包括角点检测,相机内参标定,相机外参标定,世界坐标系、相机坐标系、像素坐标系之间的映射计算等。@param objectPoints 世界坐标系下的坐标, 3xN/Nx3的一通道数据或者1xN/Nx1的三通道数据,譬如vector<Point3f>,N是点数。@param newCameraMatrix 畸变校正后图像的相机内参矩阵,默认与输入的内参矩阵相等;@param src 存在畸变的输入图像。

2023-12-22 18:07:20 862

原创 9. 使用Pthreads实现线程池(二)

首先定义存储任务信息的结构体,我们可以将其抽象为函数指针和参数,如下所示// 函数指针void *arg;// 函数参数接下来定义线程池的结构体,包含线程池的资源和状态等属性,如下所示// 工作线程数量// 任务队列的容量// 加入的任务数量// 将要保存任务信息的队列索引// 将要取出任务信息的队列索引// 线程池状态变量操作的互斥锁// 任务队列有空闲空间的信号// 任务队列中有待处理任务的信号// 工作线程数组指针// 任务队列,环形缓冲区形式// 销毁标志。

2023-12-07 20:52:50 113

原创 9. 使用Pthreads实现线程池(一)

线程池初始化时也会创建一个管理线程,它的主要职责是监视工作负载状态,动态调整线程数量来尽量快速地处理任务,同时尽量降低资源的无效占用。基本思想就是提前创建一些工作线程,将加入的任务分配给它们做处理,并根据任务/线程的数量情况动态地增删线程,确保任务处理效率和系统资源占用之间达到比较好的平衡。这里我们定义一个简化版本的线程池,其调用流程如下:构造线程池——加入任务——开始执行——销毁线程池。在接收到有任务要处理的信号后被唤醒并竞争任务,竞争到任务的线程做具体处理,没有竞争到任务的线程则会继续进入休眠。

2023-12-07 19:54:28 190

原创 ARM架构&性能优化简介

这里加速比S=1/(1-a+a/k),假如我们对某个占比60%的代码进行3倍加速,那么整体的加速比为1/(1-0.6+0.6/3)=1.6667,比3小了将近一半!比如一个应用程序A,系统运行总时间是T,某一部分执行时间为t,t与T的比值是a(t / T = a,也就是说 t = aT), 该部分性能提升k倍时执行时间为 t’ = aT / k。Amdahl 定律是计算机系统中的一个重要定律,核心思想是:我们对计算机系统的某一部分加速的时候,该加速部分对系统整体性能的影响取决于该部分的重要性和加速程度。

2023-11-10 17:33:06 393

原创 1. Pthreads专栏简介

以前硬件供应商一般都会提供相应硬件专用的线程库,使得代码的可移植性成为另开发者头疼的一个问题。在UNIX系统中,IEEE POSIX 1003.1c标准已经定义了基于C的标准化线程编程接口规范,遵守该规范实现的线程库称为POSIX threads,或者Pthreads。本专栏围绕着Pthreads展开,从API的详细介绍到使用Pthreads进行开发实战,助你入门多线程编程。教程首先介绍了线程的概念,产生的背景和设计思想,之后围绕着线程管理,互斥变量,和条件变量展开。

2023-11-07 20:46:41 173

原创 8.3 补充练习(三)

当然实际代码中不推荐在线程中申请过大的临时变量(占用栈空间),如果有使用需求建议使用系统函数(malloc等)从进程的堆上分配空间,即double* A = (double*)malloc(sizeof(double) * ARRAY_SIZE),使用完毕后再释放。一种修改方法如注释的代码所示,可以使用pthread_attr_setstacksize()重新设置线程堆栈,使其满足使用要求。,即我们调用pthread_attr_getstacksize()获得的堆栈信息。上述代码执行会报错,其原因在于。

2023-11-07 20:27:37 83

原创 8.2 补充练习(二)

如果我们仿照hello_args.c中的做法,将BusyWork()中pthread_exit()的入参由(void*)t改为(void*)&t,同时将main()中的打印传参由(long)status改为*(long*)status,会发现打印出的status值是错误的。相比join.c,这里显示创建了分离状态的子线程,因此主线程也没有调用pthread_join()来连接子线程;主线程通过调用pthread_join()等待子线程结束执行,并接收了子线程中pthread_exit()传递的参数。

2023-11-07 20:25:51 77

原创 8.1 补充练习(一)

回答:hello.c中使用值传递的形式,t当时的值会产生拷贝副本保存在子线程对应的堆栈内,t之后的变化不会影响子线程的使用;而hello_args.c中传给子线程的是t的指针,t之后的变化会影响到访问它的子线程。这是一个错误的线程参数传递调用示例,相比上面的hello.c这段代码只是将之前的值传递((void*)t)改为了指针传递((void*)&t),同时子线程接受参数时也做了相应的修改,但它是错误的,为何?如果我们将main()中的pthread_exit()屏蔽,运行后的输出如下。

2023-11-07 20:23:16 58

原创 7.4 条件变量示例

存在pthread_cond_wait()调用在pthread_cond_signal()之后的情况,此时可能会导致调用pthread_cond_wait()的线程一直被阻塞,因此在调用前需要判断附加条件是否满足。这个示例代码中展示了条件变量的用法,主线程创建了三个子线程,其中两个子线程会更新一个全局变量,第三个子线程会等待全局变量满足一定条件后开始执行操作。使用while而不是if做如上附加条件的判断,避免线程被误唤醒导致的一些问题。

2023-11-07 20:19:34 98

原创 7.3 等待条件变量/向条件变量发送信号

pthread_cond_wait()会阻塞调用该方法的线程,直到等待的条件变量接收到了信号。等待的条件变量接收到信号后,阻塞的线程会被唤醒,之前被释放的互斥量会再次被上锁。此时有可能某个线程对一些共享数据做了修改,使得实际上等待的条件不再被满足,而此时其他等待的线程已经跳过了相关的判断。需要在调用该方法前对配合使用的互斥量上锁,然后在该方法完成后对释放互斥量。在调用pthread_cond_signal()之后没有释放互斥量可能导致另一个调用了pthread_cond_wait()的线程无法被唤醒。

2023-11-07 20:19:12 66

原创 7.2 创建和销毁条件变量

入参attr用于设置条件变量的属性,只有一个可设置的属性:是否允许进程间共享,如果开启则其他进程的线程也可以识别到该条件变量。attr的类型为pthread_condattr_t,该参数也可设为NULL,此时会使用默认值。pthread_condattr_init()和pthread_condattr_destroy()用于创建和销毁条件变量属性对象。当一个条件变量不再被使用时应该调用pthread_cond_destroy()来销毁它。条件变量的类型为pthread_cond_t,必须在使用之前初始化。

2023-11-07 19:00:00 199

原创 7.1 条件变量概述

当没有条件变量时,编程人员可能需要让线程持续轮询(可能位于一个临界区内)来检查一些条件是否满足;条件变量是线程之间同步的另一种方法,互斥量通过控制线程访问数据的形式来实现同步,而条件变量通过类似于共享数据的值来实现线程间同步。一直处理任务,直到一个特定的条件需要被满足(譬如需要“计数值”达到某个大小)检查全局变量的值是否满足了线程A处理的要求,如果满足则对线程A发送信号。条件变量往往和互斥量一起使用,使用条件变量的调用顺序如下表所示。会自动使用原子操作释放互斥量,使其能够被线程B使用。

2023-11-07 09:41:28 62

原创 6.4 例程:使用互斥量

这个例程为使用多线程配合互斥量进行点乘计算,相关的数据通过全局变量的形式存在,因此可以被各个线程访问;每个线程会在相关数据的不同区域上进行处理,主线程等待子线程完成操作后,将最后的结果打印出来。

2023-11-05 17:28:24 90

原创 6.3 互斥量加锁和释放

线程可调用pthread_mutex_trylock()来尝试获取某个互斥量,如果该互斥量已经被其他线程加锁,方法会直接返回一个表示互斥量“正忙”的错误码。当多个线程同时访问共享数据时,获得互斥量的线程在完成相关操作后才能够调用该方法释放互斥量。线程可调用pthread_mutex_lock()来获取某个互斥量,如果该互斥量已经被其他线程加锁,则该线程将会被阻塞,直到互斥量被其他线程释放。问题:当多个线程同时等待一个被加锁的互斥量时,哪个线程会在互斥量被释放时首先获得它。互斥量被其他线程加锁。

2023-11-05 17:25:26 90

原创 6.2 创建和销毁互斥量

pthread_mutexattr_init()和pthread_mutexattr_destroy()用于创建和销毁互斥量属性对象;在一个互斥量不再被使用时应该调用pthread_mutex_destroy()将其销毁。参数attr用于设置互斥量的属性信息,类型为pthread_mutexattr_t,可设为NULL。互斥量的类型为pthread_mutex_t,必须在使用前初始化。注意不是所有的平台具体实现中都一定提供如上的互斥量的三种属性信息。线程共享:制定线程共享互斥量的相关信息。

2023-11-05 17:23:21 114

原创 6.1 互斥量概述

Pthreads中规定某个时刻只有一个线程能够拥有某个互斥量(或者说对该互斥量上锁),因此即使有多个线程尝试同时对某个互斥量上锁,只有一个线程会成功;此时只有该线程释放了互斥量后,其他的线程才有可能持有互斥量。注意需要由编程人员确保每个线程通过使用互斥量实现对共享数据的保护,例如如果有4的线程同时更新某个数据,但是只有一个线程使用了互斥量,那么数据仍有被意外修改的可能。当一些线程同时竞争加锁某个互斥量时,该调用是阻塞的,即没有获得互斥量的线程会阻塞住。其他的线程获得互斥量并加锁,重复上述操作。

2023-11-05 17:21:09 103

原创 5.5 其他方法

pthread_once会执行一次init_routine方法,程序中第一次调用该接口的线程将会执行init_routine方法,其他后续对pthread_once的调用都不会再执行其中的init_routine方法。pthread_self返回调用该方法的线程独有的,被系统分配的id;pthread_equal比较两个线程的id,如果不同返回0,否则返回非0值。注意由于线程的id对象为不透明的类型,我们无法直接使用C语言中的==来判断两个线程id是否相等,或者把id和其他的数值做比较。

2023-11-05 17:17:18 68

原创 5.4 堆栈管理

安全且可移植的程序中不会做默认堆栈够用的假设,而是调用pthread_attr_setstacksize为线程显式的分配足够多的堆栈。在线程堆栈被放置于内存的特定区域的系统中,应用程序可以调用pthread_attr_getstackaddr和pthread_attr_setstackaddr 方法获取/设置相关信息。POSIX标准没有给出线程堆栈大小的明确规定,这依赖于平台的具体实现,是有可能不同的。线程能够获取的最大的堆栈大小也会不同,这可能和每个架构平台的线程数量有关。

2023-11-05 17:14:57 97

原创 5.3 连接和分离线程

如果相关线程调用了pthread_exit(),编程人员能够在主线程中获取相关线程终止时的具体信息(即pthread_exit()的参数会传递给pthread_join())。线程被创建时,它的一个属性决定其是能够被连接的或者是已经分离的,只有属性为能够被连接的线程才可以通过调用pthread_join() 对其进行连接。如果一个线程的属性为已分离的,那么它不能够被连接。我们可以通过设置pthread_create()中的attr参数来设置创建线程时的这个属性,对attr的使用流程如下。

2023-11-05 17:10:53 167

原创 5.2 向线程传递参数

pthread_create()允许编程人员向线程的执行方法中传入一个参数,对于需要传递多个参数的情况,可以将这些参数封装到一个结构体中,然后将结构体对象的指针作为参数进行传入。这个例程中进行了错误的参数传递,它把所有线程都能访问的共享内存中的变量t的地址传递给了各个线程。随着循环的进行,t的值可能会发生预料外的改变,从而对使用它的线程产生影响。主线程中每个子线程使用独有的一份数据内存进行传输,确保每个线程参数在传递过程中互不干扰。问题:考虑到线程启动和调度的不确定性,如何将参数安全地传递给创建的线程?

2023-11-05 17:07:24 168

原创 5.1 创建和销毁线程

同时也可以设置线程的调度优先级。下面的例子展示了如何在Linux中获取和设置有关线程数限制的信息,首先我们获取了当前默认的设置,然后将进程的最大数量(包含线程)设为最大值,最后我们验证了修改生效。如果在main()中没有显式调用pthread_exit(),可能会出现主线程比它创建的线程更早结束的情况,此时所有的线程都会被强制结束,从而产生一些超出预期的情况。在pthread_exit()方法中编程人员可以传入一个可选的有关终止状态的参数,这个参数会传递给连接了被终止线程的其他线程(后续章节内容中阐述)。

2023-11-02 20:55:35 196

原创 4.编译多线程应用程序

Linux中pthread作为一个单独的库存在(libpthread.so),而在其他Unix系统中却不一定,在这些系统中使用-lpthread是无法实现链接到对应的pthread库的作用的;而-pthread选项除了会链接pthread库,还会增加一些影响编译的宏的定义,使得一些老版本基础库中的接口是线程安全的。gcc下编译时我们会碰到两个选项-pthread和-lpthread,记住推荐使用-pthread而不是-lpthread,原因如下。在不同平台下使用多线程的程序编译时的编译选项设置如下图所示。

2023-10-30 17:30:30 183

原创 3. Pthreads API

目前的POSIX标准只支持C语言,Fortran编程人员可以使用封装了相关C实现的接口进行编程,有些Fortran编译器可能提供了一个Fortran版本的Pthreads API。对互斥量进行创建、销毁、加锁、解锁操作的函数,还有对其进行设置/获取属性的函数。对象隐藏不透明的设计概念贯穿整个API——基础接口用于创建/修改相关对象,同时使用相关接口来修改对象的相关属性。包括创建、销毁、等待、发出信号等操作,和设置/获取属性的相关函数。线程管理:线程的创建、分离、连接等,还有设置/获取线程的相关属性等函数。

2023-10-17 20:56:14 107

原创 2.4 设计多线程的程序

譬如允许的线程最大数量,和线程的默认堆栈大小,这两个重要信息可能在不同平台上有差异,而它们又是设计程序中需要特别注意的信息。如果两个任务在时间轴上是可交换的,互相交错的,那么它们可以用各自的线程来执行,如下图所示。所有的线程可以访问全局共享内存,同时它们也有自己的私有数据。对于编程人员来说,使用第三方库的影响在于如果你无法100%确定某个操作是线程安全的,那么有可能会带来相关的问题。流水线(pipeline):一个任务被分解为多个子操作,每个子操作被单独的线程执行,汽车流水线的生产模式和其十分相像。

2023-10-13 15:20:33 90

原创 2.3 为何使用Pthreads

和进程相比,系统在创建和管理线程时的开销要小的多,这里通过比较调用fork()创建进程和pthread_create()创建线程时的耗时开销来说明。在支持高性能计算的平台上使用Pthreads可以实现性能的最优化,特别是当一个应用使用MPI进行进程间通信时,此时使用Pthreads代替MPI一般可以获得更高的性能。最坏的情况下,使用Pthreads编程时可能会遇到缓存到CPU或者内存到CPU的带宽问题,但整体来说其速度仍然要比通过共享内存通信的MPI要快不少。

2023-10-10 20:27:17 109

原创 2.2 Pthreads是什么

以前硬件供应商一般都会提供相应硬件平台专用的线程库,使得多线程编程的代码的可移植性成为另开发者头疼的一个问题。为了更好地利用线程进行相关开发,制定标准的线程编程接口迫在眉睫,由此Pthreads诞生了。Pthreads使用C语言实现,包括一个pthread.h头文件和一个库文件;有时候它不一定是独立的库文件,而是被包含在其他库文件之中,譬如libc。POSIX标准,包括Pthreads规范目前也在持续更新中。

2023-10-10 20:15:27 110

原创 2.1 线程是什么

对于开发者,独立于主程序运行的一个“程序”可以称为一个线程。更进一步来说,如果一个应用包含多个“程序”,这些“程序”能够被操作系统同时/独立的运行,我们会称它为多线程的应用。线程是属于进程的一种资源,且使用进程的其他资源,能够被操作系统调度作为独立个体运行。为了完成上述功能,线程只持有一些能够使其正常运行的必要资源,包括。在理解线程的概念之前,我们需要先理解UNIX中的进程。技术上来说,线程是操作系统能够操作运行的一组独立的指令运算流程;更具体地来说,它的意义如下。下图是拥有线程的进程所持有的资源示意图。

2023-10-10 19:52:57 86

原创 MISRA C 2012 阅读笔记

MISRA C:2012(第三版,第一次修订版)发布于 2019 年 2 月,整合了此前发布的 AMD1(修订案 1,MISRA C:2012 的附加安全准则)和 TC1(技术更正 1) 的内容,包含 173 条规则。市面上也有相关的静态分析工具进行代码的自动化检测,支持如MISRA C以及其他的编程规范,进行代码的自动化检测。从编程人员的角度来说,阅读MISRA C的相关编程规范还是很有裨益的,因为它确实从各个模块具体地提出了多种编程规范/建议,使得编程人员能够更容易写出符合预期的、清晰易懂的C代码。

2023-10-07 13:38:27 187

原创 普通相机标定——OpenCV函数讲解(上)

我们使用OpenCV进行标定算法的开发,这里使用的是OpenCV3.4.6版本。使用OpenCV标定相机的算法流程如下。Step1.检测之前采集的多张图像中的棋盘格角点像素坐标Step2.利用棋盘格角点的像素坐标、世界坐标,计算相机的内参、畸变系数Step3.利用相机的内参、畸变系数对原始图像做畸变矫正其中第二步已经完成了标定操作,第三步则是验证标定结果。这些操作都可以通过调用OpenCV函数完成,因此我们需要了解相关API的接口和功能定义。

2023-06-28 22:32:36 696

原创 普通单目相机标定——准备工作

这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。1)由世界坐标系变换至相机坐标系,Pc=R*Pw+t2)相机坐标系下点投影至归一化平面Zc=1上,得到归一化坐标Pc’(x,y)=(Xc/Zc,Yc/Zc),以及对应的极坐标(r,θ)

2023-06-23 17:38:26 1169

原创 相机成像模型(二)

这里我们给出普通相机(非鱼眼相机)的一种常用的畸变模型如下,对于相机坐标系中的点(Xc,Yc,Zc),做如下转换得到归一化平面中的坐标(x,y,1)与对应的极坐标(r,θ)。用如下多项式表示径向畸变的作用,其中(x,y)为不存在畸变时的点坐标,(xcorrected, ycorrected)为产生了畸变之后的点坐标,其变换关系如下所示。我们将包含(fx,fy,u0,v0)的3x3矩阵称为相机内参矩阵,将[k1,k2,k3,p1,p2]称为相机的畸变矩阵,相机。用如下多项式表示切向畸变的作用。

2023-06-08 12:01:20 1021

原创 相机成像模型(一)

相机的成像过程为世界中的某一点映射到图像中某点像素位置,为了量化表达其过程,引入了四个坐标系,分别为世界坐标系、相机坐标系、物理成像平面坐标系、像素坐标系。首先不考虑畸变的影响,我们来推导世界坐标系中某点(Xw,Yw,Zw)映射到像素坐标系的(u,v)的过程。

2023-06-06 20:55:59 721

原创 OpenCV实战之人脸美颜美型(九)——瘦脸

本讲我们围绕瘦脸功能展开,瘦脸的功能很明确:让脸部变得瘦削,如下图所示。从图像处理的角度来说它将脸部轮廓周围的图像进行收缩操作,同时还要确保收缩后图像分布连续;与大眼算法类似,它也是一种非线性变形的算法。

2023-05-21 16:29:38 875 1

MISRA C:2012手册原版+中文翻译版

MISRA C:2012手册原版+中文翻译版 推荐使用C语言编程的程序员阅读使用

2023-09-26

MTCNNTest.zip

python中使用TF2实现MTCNN的完整推理

2021-03-06

intel_ocl_caps_basic_win.zip

Intel OpenCL示例项目,得到GPU的相关设备信息并打印,用于测试Windows下OpenCL环境搭建是否成功

2019-10-10

opengl_test.zip

1)Vaserenderer是一个开源抗锯齿绘线库,github主页:https://github.com/tyt2y3/vaserenderer 2)在原始代码上做了部分改动,使其支持OpenGL2.0及其以上版本,即可编程管道渲染;可以在config.h中通过定义USE_OPENGL_VERSION_1_1或者USE_OPENGL_VERSION_2_0来选择使用固定管道渲染或是可编程管道渲染

2019-07-19

DLoopDetector中demo运行需要的测试数据集

DLoopDetector中demo运行需要的测试数据集百度云盘下载链接

2018-06-06

《无人驾驶车辆 模型预测控制》随书代码

《无人驾驶车辆 模型预测控制》随书matlab代码。本书主要介绍模型预测控制理论与方法在无人驾驶车辆路径规划与跟踪控制方面的基础应用技术。由于模型预测控制理论数学抽象特点明显,初涉者往往需要较长时间的探索才能真正理解和掌握,进一步应用到具体研究,则需要更长的过程。本书详细介绍了应用模型预测控制理论进行无人驾驶车辆控制的基础方法,结合路径规划与跟踪实例给出了Matlab仿真代码和详细仿真步骤,并且融入了研究团队在本领域的研究成果。

2017-12-05

meanShift视频目标跟踪 C++实现源代码

使用C++实现了meanShift跟踪算法,通过跟踪视频中的物体验证了其可行性。文档中包含源代码和一个meanShift原理讲解文档

2017-11-06

卡尔曼推导流程记录和一个matlab例程

比较详细的个人卡尔曼滤波原理推导过程记录,同时附了一个matlab例程

2017-10-24

PCL1.8 All-in-one安装包百度云下载地址

PCL1.8 all-in-one安装包百度云下载地址,其中包括vs2015-win64版本、vs2013-win32版本、vs2013-win64版本

2017-10-11

学习opencv-中文版_英文版和随书代码

包括学习opencv的中文英文两种版本pdf和书中的示例代码;学习opencv的经典书籍,涉及到一些基础理论知识的详细讲解

2017-09-26

opencv标定单目相机

使用opencv2413版本通过张正友法进行单目相机标定,提供了用于标定的原始图片和标定代码,简单修改后即可在VS上运行

2017-09-25

汽车牌照训练素材+字符识别训练素材

将CSDN上相关资源搜集后整理的,里面包含的是车牌照片(包括整车、单独车牌、车牌上字符的单独分割)和常用字符照片(数字+大写字母)

2017-09-14

点云库PCL学习教程-PDF完整版

花了点心思才搜集完整的PDF,分享给大家

2017-08-04

opencv2计算机视觉编程手册随书源代码

《opencv2计算机视觉编程手册》随书源代码,完整版本;适合新手入门学习opencv

2017-07-12

DirectShow_Win10(亲测可用)

DirectShow工具包,下载后解压即可。在工程中添加对应的包含目录,亲测win10下可以使用

2017-06-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除