tag 标签: opencv

相关帖子
相关博文
  • 热度 3
    2024-2-3 15:21
    505 次阅读|
    0 个评论
    OpenCV中的Moments类用于**计算图像的矩(moments)**,这是一种描述图像形状的数学工具。 在计算机视觉和图像处理中,矩用来表征图像的形状特征,类似于物理学中物体质量分布的概念。OpenCV提供了`cv::moments()`函数,它能够计算图像的中心矩(最高到三阶)。这些矩可以用来计算图像或轮廓的质心位置、面积、方向等重要特性。 以下是Moments类的一些主要用途: 1. **质心计算**:利用矩可以计算出图像或轮廓的质心坐标。 2. **形状分析**:通过分析图像的矩,可以获取有关图像形状的信息,例如是否对称、大小比例等。 3. **图像匹配**:在某些情况下,矩可以用于图像匹配任务,通过比较两个图像的矩来判断它们是否相似。 4. **方向估计**:对于非对称形状,可以通过矩来估计其主轴的方向。 5. **Hu矩**:除了中心矩之外,OpenCV还提供了`HuMoments()`函数,用于由中心矩计算出一组称为Hu矩的特征值,这些特征值对图像的缩放、平移和旋转具有不变性,广泛用于图像识别和分类任务。 此外,使用`cv::moments()`时,可以选择是否将图像视为二值图像。如果设置为真,则所有非零像素都会按值1对待,这通常用于简化计算并提高处理速度。 总的来说,Moments类在OpenCV中扮演了形状分析和特征提取的角色,是进行高级图像处理和理解的重要工具之一。
  • 2024-1-25 14:28
    220 次阅读|
    0 个评论
    双目视觉是一种利用两个摄像头从不同角度拍摄同一场景,通过计算两幅图像之间的视差信息来获取物体的深度信息的技术。在OpenCV中,我们可以使用StereoBM、StereoSGBM和StereoMCC等算法来实现双目视觉。 首先,我们需要安装OpenCV库,可以使用以下命令进行安装: ```bash pip install opencv-python ``` 接下来,我们将使用StereoBM算法实现双目视觉。以下是一个简单的示例代码: ```python import cv2 import numpy as np # 读取左右相机拍摄的图像 left_image = cv2.imread('left.jpg', cv2.IMREAD_GRAYSCALE) right_image = cv2.imread('right.jpg', cv2.IMREAD_GRAYSCALE) # 创建StereoBM对象 stereo = cv2.StereoBM_create(numDisparities=64, blockSize=15) # 计算视差图 disparity = stereo.compute(left_image, right_image) # 显示结果 cv2.imshow('Disparity', disparity) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了左右相机拍摄的图像(假设它们已经进行了校正),然后创建了一个StereoBM对象。接着,我们使用`compute`方法计算了视差图。最后,我们显示了视差图。 需要注意的是,为了获得更好的效果,通常需要对输入图像进行预处理,例如缩放、平滑滤波等。此外,还可以尝试使用其他算法,如StereoSGBM和StereoMCC,以获得更准确的深度信息。 总之,OpenCV提供了丰富的双目视觉算法,可以帮助我们轻松地实现双目视觉。通过学习和实践这些算法,我们可以更好地理解双目视觉的原理和应用。
  • 热度 2
    2023-10-12 18:27
    971 次阅读|
    0 个评论
    在RISC-V上编译OpenCV需要一些准备工作。首先,确保您的系统已安装了RISC-V版本的GCC编译器和相关的构建工具。然后,按照以下步骤进行操作: 下载OpenCV源代码。您可以从OpenCV官方网站下载最新版本的源代码。 解压源代码文件。使用以下命令将压缩文件解压到指定目录: 复制代码 tar -xzf opencv-x.x.x.tar.gz -C /path/to/destination/ 进入解压后的目录。使用以下命令进入解压后的目录: bash 复制代码 cd /path/to/destination/opencv-x.x.x 配置构建。使用以下命令配置构建选项: bash 复制代码 ./configure --with-riscv --prefix=/path/to/installation/directory 编译OpenCV。使用以下命令编译OpenCV: 复制代码 make -j4 安装OpenCV。使用以下命令将编译后的OpenCV安装到指定目录: go 复制代码 make install prefix=/path/to/installation/directory 完成。现在,您已成功在RISC-V上编译和安装了OpenCV。您可以使用相应的include路径和库文件来链接和编译您的项目。 请注意,以上步骤中的命令可能因您的具体环境和配置而有所不同。确保在执行每个步骤之前查看OpenCV文档以获取更多指导和帮助。
  • 热度 27
    2019-3-19 11:26
    4069 次阅读|
    0 个评论
    By Toradex 胡珊逢 1). 简介 伴随着 4G 网络的大范围覆盖,已经即将到来的 5G 网络,边缘计算越来越多地开始进入人们的视野。相比于云计算的云端集中处理,边缘计算能够就地进行复杂数据的计算,并迅速作出决策。由于免去了数据的远程传输,边缘计算能够带来更低的延时、更可靠的数据安全。但这也对边缘计算设备带来更大的挑战,特别是计算性能。下面我们将介绍如何在 NXP 最新的 iMX8X ARM 处理器上面利用 GPU 加速运算快速傅里叶变换 FFT 。 本文所演示的 ARM 平台来自于 Toradex Colibri iMX8X 计算机模块,此模块是 Toradex 基于 NXP iMX8 X 推出的紧凑型 Arm 核心板。 iMX8X 具有最高 4 核 64-bit Armv8-A Cortex-A35 ,主频 1.2GHz 。 Colibri iMX8X 板载 WIFI 和蓝牙,使其能够便捷地连接网络和移动设备。集成 Cortex-M4 处理器, iMX8X 除了支持 Linux 等高级操作系统外,还可以同时运行 FreeRTOS ,执行低功耗或者实时应用。丰富的工业接口如 CAN 、 SPI 、 UART 、双以太网等,便于连接外部设备。 GC7000Lite GPU 图形处理单元,峰值算力 64 GFLOPS ,支持 OpenCL 、 OpenGL 以及 Vulkan ,方便用户利用 GPU 资源。使用 GPU 处理计算密集型数据,除了能够提高效率外,还可以有效降低 CPU 负荷,保证用户应用流畅运行。接下来你将会了解如何使用 OpenCL 在 iMX8X 上的 GPU 实现 FFT 计算。 2). 搭建开发环境 在撰写本文时, Toradex 基于 imx-4.9.123 Linux BSP 提供 Colibri iMX8X 的支持。由于是早期发布阶段, Toradex SDK 并没有集成使用 OpenCL 在 GPU 计算 FFT 的库文件,如 GLi 、 Tclap 等。为了生成完整的 SDK ,我们将使用 NXP 标准的 Yocto 环境来生成 SDK 和 FFT demo 。 ./ 初始化 Yocto ------------------------ $ mkdir imx-yocto-bsp $ cd imx-yocto-bsp $ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-rocko -m imx-4.9.123-2.3.0-8mm_ga.xml $ repo sync ------------------------ ./ 修改 local.conf.org ,添加下面内容 ------------------------ IMAGE_INSTALL_append = " devil devil-dev imx-gpu-sdk libzip" CONF_VERSION = "1" TOOLCHAIN_TARGET_TASK += " devil-dev imx-gpu-sdk libzip" ------------------------ ./ 编译文件系统和交叉编译工具 ------------------------ $ bitbake fsl-image-gui $ bitbake meta-toolchain ------------------------ ./ 提取文件系统文件,其中包括编译所需的头文件等 ------------------------ $ runqemu-extract-sdk ~/imx-yocto-bsp/build-imx8qxpmek/tmp/deploy/images/imx8qxpmek/ fsl-image-gui-imx8qxpmek-20190315085707.rootfs.tar.bz2 ~/imx8qxpmek-rootfs ------------------------ ./ 添加 OpenCL 头文件 可以从下面下面链接下载 https://github.com/KhronosGroup/OpenCL-Headers ,解压后将其复制到 .../imx8qxpmek-rootfs/usr/include/ ./ 建立 libzip 库软链接 ------------------------ $ cd ~/imx8qxpmek-rootfs/usr/lib $ ln -s ../../lib/libz.so.1.2.11 libz.so.1 ------------------------ ./ Colibri IMX8X SD 卡文件系统构建和烧写方法请参考 这里 。 3). OpenCL FFT demo 编译 NXP 的 DemoFramework 提供了大量基于 GPU 的 demo ,包括使用 OpenCL 、 OpenGL 和 Vulkan ,用户通过这些 demo 快速了解 iMX GPU 的开发使用方法。下载地址 https://github.com/NXPmicro/gtec-demo-framework ./ Toradex Colibri iMX8X 的 imx-4.9.123 Linux BSP 采用 DemoFramework v5.1.1 。下载后解压,并进入该目录,设置编译的环境。 ------------------------ $ cd gtec-demo-framework-5.1.1 $ pushd ~/imx-yocto-bsp/build-imx8qxpmek/tmp $ source environment-setup-aarch64-poky-linux $ export ROOTFS=~/imx8qxpmek-rootfs $ export FSL_PLATFORM_NAME=Yocto $ popd ------------------------ ./ 编译 FastFourierTransform ------------------------ $ source prepare.sh $ cd DemoApps/OpenCL/FastFourierTransform $ FslBuild.py ------------------------ 在 Yocto 编译环境中,系统会根据依赖关系自动下载所需的软件包。 4). 运行 FFT demo ./ 为了便于观察 FFT 结果,我们修改输入信号,使用单频率的正弦函数。例如以 44.1KHz 频率采样一个 1KHz 的信号,采样点数 4096 ,并对采样结果做 FFT 变换。 https://github.com/NXPmicro/gtec-demo-framework/blob/master/DemoApps/OpenCL/FastFourierTransform/source/FastFourierTransform.cpp#L432 中的三角波修改正弦信号。 ------------------------ m_Freal = m_intime = sin(1000 * (2 * 3.1415926) * i / 44100); m_Fimag = m_intime = 0; m_outfft = m_outfft = 0; ------------------------ ./ 将编译好的 FastFourierTransform 和 Content 目录以及其中的 fft.cl 文件一起复制到 Coliri IMX8X 上。 fft.cl 是 OpenCL 内核文件。执行后生成 fft_input.csv 、 fft_output.csv 两个文件,分别保存输入信号和 FFT 运算结果。 输入信号 FFT 运算结果 ./ 从输出结果看,在第 93 点模值达到最大,该点对应的频率为 44100/4096*93=1001.2Hz ,即输入正弦信号的频率。 ./ 下面是 demo 的运行日志。 GPU 会根据采样点数,分解成多个蝶型运算模型,并将每个模型并行在 GPU 上执行,从而有效降低运算时间。从日志看到每个模型耗时都在 1ms 以内, GPU 累计耗时为 0.004604 秒。但由于是并行计算,最终的时间则是小于该值。 ------------------------ Compiling radix-2 FFT Program for GPU... creating radix-2 kernels... Creating kernel fft_radix2 0 (p=1)... Creating kernel fft_radix2 1 (p=2)... …… Creating kernel fft_radix2 10 (p=1024)... Creating kernel fft_radix2 11 (p=2048)... Setting kernel args for kernel 0 (p=1)... Setting kernel args for kernel 1 (p=2)... …… Setting kernel args for kernel 10 (p=1024)... Setting kernel args for kernel 11 (p=2048)... running kernel 0 (p=1)... running kernel 1 (p=2)... …… running kernel 10 (p=1024)... running kernel 11 (p=2048)... Kernel execution time on GPU (kernel 0): 0.000209 seconds Kernel execution time on GPU (kernel 1): 0.000279 seconds Kernel execution time on GPU (kernel 2): 0.000507 seconds Kernel execution time on GPU (kernel 3): 0.000505 seconds Kernel execution time on GPU (kernel 4): 0.000065 seconds Kernel execution time on GPU (kernel 5): 0.000550 seconds Kernel execution time on GPU (kernel 6): 0.000457 seconds Kernel execution time on GPU (kernel 7): 0.000534 seconds Kernel execution time on GPU (kernel 8): 0.000413 seconds Kernel execution time on GPU (kernel 9): 0.000037 seconds Kernel execution time on GPU (kernel 10): 0.000524 seconds Kernel execution time on GPU (kernel 11): 0.000524 seconds Total Kernel execution time on GPU: 0.004604 seconds Successful. ------------------------ ./ 在 Toradex 基于 NXP iMX6Q 处理器的 Apalis iMX6Q 2GB IT 模块上,我们使用 FFTW 库在 CPU 上同样进行 4096 点 FFT 运算,并将 CPU 的时钟调整至最高频率进行对比。测试代码从 这里 下载。 运行耗时为 12.4ms 。 5). 总结 Colibri iMX8X 异构多核构架包含 Cortex-A35 、 GC7000Lite GPU 和 Cortex-M4 。 GPU 可以发挥其并计算的能力,除了实现 FFT 外,还可以用于图形处理运算和深度学习模型推理。通过 Cortex-M4 实现实时数据采集,并由 GPU 完成数据处理,最后在 Cortex-A35 上的操作系统如 Linux 完成数据保存、呈现和传输任务,以及用户交互。 Colibri iMX8X 是边缘计算设备的理想平台。后续我们会向你展示更多 Colibri iMX8X 的应用开发。
  • 热度 17
    2013-2-20 19:43
    1870 次阅读|
    0 个评论
      之前写了一个自己当时的操作流程, 偶然看到一个当时自己移植opencv的总结, 当时用了一个月才弄明白怎么回事, 这里放到这里, 一是保留,也希望其他人能在这里节省时间。   嵌入式ARM系统中安装 这里使用的是Opencv1.0.0版。 首先说明这里之所以取1.0版本, 是因为当时我的编译器是3.4.1, 我试过编译2.0的但是不行。 后来分析了一下它的部分代码, 发现里边有宏定义要求4.0以上的才行。 所以以后也就都用1.0了。   下边是操作步骤: 首先解压文件:tar -jxvf opencv-1.0.0 之后: OpenCV库编译 ./configure --host=arm-linux --without-gtk --without-carbon --without-quicktime --without-1394libs --without-ffmpeg --without-python --without-swig --enable-static --disable-shared --disable-apps CXXFLAGS=arm-linux-g++ CPPFLAGS=-I/usr/include CXXFLAGS=-O2 --host=arm-linux :指出交叉编译arm平台  --without-gtk:忽略gtk+2.0 windows  --without-carbon: 不使用Mac OS上的X库  --without-quicktime  --without-1394libs --without-ffmpeg --without-python --without-swig --enable-static :生成静态库 --disable-shared:不生成动态库 --prefix=/usr/local/opencv :指定文件安装路径 --exec-perfix=/usr/local/opencv :当前未知 CXXFLAGS=-O2 :对编译进行优化//在编译时,尽量用-O2进行优化,否则容易出问题, 如果没有用,则自己对makefile文件,进行修改,将其优化选项改为-O2。 切记 生成makefile后,修改里边的otherlibs,将含有他的子目录将其删掉。 ( 这里使用O2优化我也说不好,因为文件中默认的优化等级是O3, 开始没有编译成功, 后来我换成O2就成功了, 应该是里边有什么地方, 没有注意到。 ) make  make install export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 之后: 根据需要在/usr/local/lib/pkgconfig/opencv.pc的Libs项中加入参数-lpthread、-ldl之类, 例如  Libs: -L${libdir} -lcv -lcxcore -lcvaux -lml -lpthread -ldl (-lcv -cvaux -lml -lpthread -dl -highgui -lm)//如果遇到问题,可以先添加这几个链接库试试, 看是否好用。 如果在编译时仍出问题,则将-lpthread -ldl直接写在makefile文件里,进行连接。 同时在这里可能没有包含math库,所以要自己,-lm进行连接math库 这里应该编译成功, 然后再下载到开发板中, 运行时可能还会出错,如果提示出现缺少libstdc++库的情况,可以在arm编译器目录下的lib目录中查找,拷贝到开发板中的/lib中,保程序可以找到即可。 这样以后,应该可以运行,如果有错,再到网上查找原因吧。 总结一点: 这里有这么多错误, 不过有很多是自己, 没有好好看出错原因而导致的无从下手更改。 还有就是,不知道错误原因是什么, 虽然看到了,报错, 却总是不知道,错在哪里,应该如何纠正。 说明自己在程序方面,还有很大的缺陷。 在出错时,第一个想到的不是去网上查找,如何解决, 而是自己逐行分析,错误的提示, 查找错误存在的位置,并分析。 这时,如果仍没有头绪,再上网将自己的错误报告贴出来, 让大家一起分析。 这样才知道,自己错在哪里,为什么错,该怎样分析这个错误, 错误的原因是什么,怎样改正这个错误。 这是在这次移植Opencv1.0.0时,收获最大的。 /////////////////////////////// Run "gcc -dM -E - /dev/null" to see a list of gcc defined symbols 查看GCC的所有默认宏定义   在移植完成后有些方还是要修改。 主要是canny算法中有一个地方在1.0中是不适合,arm中用的。 主要现象是, 在调用设计canny的算法时, 图像处理后是全黑的情况。   原因是在使用cvRound函数时, 返回的数值, 在PC和arm上是正好相反的。   解决方法如下: 找到 vcCanny中的cvRound函数 typedef union Cv64suf  {  int64 i;  uint64 u;  double f;  }  Cv64suf;  int cvRound( double value )  {  #if 1  Cv64suf temp;  temp.f = value + 6755399441055744.0;  printf("f = %f, %d, %d\n", temp.f, (int)(temp.u 32), (int)(temp.u 0xFFFFFFFF) ); return (int)temp.u;  #endif  } 将红色字体部分改为return int(value + 0.5); 这样就可以解决图像全黑的情况, 下来就可以使用opencv做自己的项目了。   所以如果是要移植2.0,或2.1以上建议使用4.0以上的编译器。 还有在2.0.0和2.1中已经解决了上边图像处理后全黑的代码, 所以在2.0和2.1中即使移植到arm中也是不会出现, 处理图像后,图像全黑。   这个不足的是用的arm920T内核中如果没有浮点运算单元, 程序执行起来, 会显得有些慢, 我当时一幅图像分析完,基本得要30s, 如果有浮点运算单元, 估计速度会好好多 如果用arm做的话,建议使用单浮点运算的。   在opencv的官方网站里有好多问题的解决, 上边的很多问题,就是在那里解决的, 可以多去看看。
相关资源