2017-12-02 13:41:52 u013685902 阅读数 33007

最近写了一个J2EE的项目,其中用到了OpenCV的相关内容,所以下载了一个OpenCV库,并且在Windows下面做了开发测试,话不多说,这里直接给下载链接 https://opencv.org/opencv-3-3.html 。在这个链接页面中,可以找到不同平台下的OpenCV库,分别是windows、iOS、安卓以及源码包,如下图:
这里写图片描述

**

1. windows下使用OpenCV

**

首先简单说一下在windows下面使用OpenCV,这个相关的内容和帖子也比较多,我就不赘述,直接说操作流程就行,也算是对大家工作的一个小总结,跟大家看的其与相关帖子大同小异。下载windows下的OpenCV自解压库,即上图中的第一个红色方框,下载之后安装(其实也就是解压缩),就能得到一个文件夹,进入该文件夹,可以得到如下的一些子文件夹:

其中sources文件夹里面是源代码,跟我们从之前下载链接中第四个红色方框下载的内容是一样的;还有一个是build文件夹,可以理解为windows下面编译安装之后的OpenCV库。进入build文件夹,可以发现以下几个子文件夹

这里写图片描述

到了这里基本上大家就能找到自己想要的东西了,因为我自己写的是J2EE的项目,所以我直接进入java文件夹,内容如下图:

这里写图片描述

发现了opencv-330.jar包,毫无疑问,需要在项目中 add build path;此时就可以使用一些基本的函数了,这里我贴出一份官方案例,也就是之前图中 sources\samples\java\ant\src 这个路径下的java文件,代码如下:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;

class SimpleSample {

  static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

  public static void main(String[] args) {
    System.out.println("Welcome to OpenCV " + Core.VERSION);
    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
    System.out.println("OpenCV Mat: " + m);
    Mat mr1 = m.row(1);
    mr1.setTo(new Scalar(1));
    Mat mc5 = m.col(5);
    mc5.setTo(new Scalar(5));
    System.out.println("OpenCV Mat data:\n" + m.dump());
  }

}

但是系统运行之后会报错【no opencv_java330 in java.library.path】,也就是没有在 java.library.path 里面找到 opencv_java330 这个库。我们只需要将这个库引入到 java.library.path 即可,说到这儿,顺便补充一句,可能有的人会问 java.library.path 是什么,大家不同的电脑上面配置可能不太一样,可以直接在程序中打印输出 java.library.path ,代码如下

System.out.println("Java Library Path"+System.getProperty("java.library.path"));

知道了java.library.path之后,我们发现java下面还有两个文件夹,分别是x64和x86,不用多说,分别对应64位和32位的 windows 系统,两个文件夹下面都只有一个文件,就是opencv_java330.dll,也就是我们需要的动态链接库,将这个文件粘贴复制到 java.library.path下面去即可,通常也就是 %JAVA_HOME%/bin下面,有的人也会放在 %JAVA_HOME%/jre/bin下面,这个都可以,我测试了不影响。

其实看完在windows下面使用OpenCV的流程不难想象,opencv-330.jar算是opencv针对java开发的一套接口,这一套接口的背后是调用 opencv_java330.dll 里面的函数来完成具体的工作。那么如果将工程项目部署到linux下面去,一样也应该有这么一个jar包和类似于dll一样的库函数,知道了这一点,接下来就能理解在linux下面安装和使用OpenCV了。

2. Linux下使用OpenCV

我在windows下面开发了J2EE项目之后打包成war文件,然后发布到Linux的tomcat服务器上部署,当时觉得jar包应该是平台通用的,但是我没有引入dll,所以程序应该无法启动,会报错,果不其然,报错如下【java.lang.UnsatisfiedLinkError: no opencv_java330 in java.library.path】,于是我按照我在windows下面的思路,直接把 opencv_java330.dll 复制到我在linux下面的java.library.path里面去了(现在看来,真是闹了个笑话,jar包确实是跨平台的,但是没说 dll 也是跨平台的啊,简直naive啊),错误依旧。这个时候也就能理解为什么之前的下载链接中强调Windows self-extracting archive,因为下载下来的工具只能在windows下面使用,在linux下面需要自己编译和安装,而下载中提供了源代码,接下来就需要根据源码来编译安装OpenCV了。

第一步,下载源码包,即第一幅图中的第四个链接;
第二步,解压缩, tar -zxvf opencv-3.3.0.tar.gz,会得到一个opencv-3.3.0的文件夹
第三步,cmake编译。说到这儿,需要强调一下,cmake 编译之前可以提前准备一下必要的工具包,诸如安装java/python等,如果大家不知道准备什么工具也不要紧,假设大家都已经准备好了必要的安装工具,直接开始编译,代码如下

cd opencv-3.3.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/software/opencv ..

cmake的参数就不赘述了,也就是根据源码编译并且安装到 /home/software/opencv 这个目录下面,编译完成之后会打印输出一个清单,也就是会安装哪些东西,安装到哪个目录,类似于Windows下面正式安装之前的一个显示页面,我在这个页面吃了一个大亏,因为我需要安装opencv的java相关库,而第一次安装的时候我的系统里面没有安装ant,所以清单里面显示java 一栏中 ant 后面显示 NO,就这个东西导致我安装虽然成功了,但是仍然没有我想要的opencv_java330库,所以这里也提醒一下大家,可以根据自己需要的环境来安装对应的库,如果缺失了就及时补充对应的工具包,然后再安装,也就是在 make 和 make install 之前要确保 cmake 运行之后的清单里面要有自己想要的东西。然后我补充安装 ant ,重新 cmake 编译一次,这一次输出打印的清单里面java 后面的所有内容都是 YES 了。

第四步:make编译。为了加快编译,可以多核编译 make -j7
第五步:安装 make install

安装完成之后到安装目录

cd /home/software/opencv

可以发现4个文件夹,如下图:
这里写图片描述

bin下面是一些基本的工具,lib是库,include下面包含了opencv和opencv2,进入到share文件夹下面

cd share

有一个 OpenCV 文件夹,进入OpenCV文件夹

cd OpenCV

可以发现如下的一些文件夹:
这里写图片描述

有java文件夹,进入该文件夹,发现了如下的两个文件:
这里写图片描述

功夫不负有心人,对应的jar包和库文件全部都有了,jar包和windows下面的jar包是通用的,只需要将 libopencv_java330.so 拷贝到linux系统下的java.library.path下面去即可。

参考链接:
http://www.mamicode.com/info-detail-2002782.html
http://blog.csdn.net/lu_android/article/details/78583275
http://blog.csdn.net/XinyanH/article/details/78365305

2018-05-04 20:04:03 dlh_sycamore 阅读数 213

就照着这个博客来吧:
https://blog.csdn.net/abcsunl/article/details/63686496

但我按照这个博客Cmake编译时总出现错误:
Error: The source directory “/home/dlh/opencv-3.1.0/release/CMAKE_INSTALL_PREFIX=/home/michael/opencv-3.1.0” does not exist.

所以我在网上查了一下:
运行这个命令:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..  

有时候又要把-D后面的空格去掉,原因不明
有时候又直接就可以…

运行完上面的命令后,进行编译:

make

安装opencv库到系统:

sudo make install 

再测试一下

python
import cv2
2016-09-17 18:41:56 CanvaChen 阅读数 2074

我的第一篇博文已经讲过在Windos下,codeblocks编译器使用VS2013的VC,并集成opencv。http://blog.csdn.net/canvachen/article/details/52549283
上一篇我也讲过,我已经决定加入Linux大军。这篇就来讲讲Linux下OpenCV开发环境的搭建。其实在Linux上开发opencv比较简单。以下以Debian为例。

1.进CodeBlocks官网下载适合自己系统的安装包,我的是codeblocks_16.01_amd64_jessie.tar.xz。提取后里面有几个.deb文件,在终端用dpkg -i name.deb全部安装这几个文件,注意先安装依赖文件。
2.接下来安装opencv。比较快的方法是直接用apt-get install安装。
如果想用更新的版本,比如2.4.13或3.1.0,就要去opencv官网下载linux用的源码,然后用cmake编译。过程如下:
首先解决依赖问题。
sudo apt-get install build-essential

sudo apt-get install cmake libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install python-dev python-numpy libjpeg-dev libpng-dev libtiff-dev libjasper-dev

接下来将官网下的opencv-2.4.13.zip解压并进入目录,继续执行如下。
mkdir build
cd build
cmake ..
sudo make
sudo make install
sudo make这句至少需要几个小时才能编译完,做好心理准备。

3.打开codeblocks新建一个project,选择console application。新建完成后工程右键,选择build option,配置Debug的Search directories的Compiler和Linker,以及Linker settings。
其中,Compiler添加要引入的头文件位置/usr/local/include/opencv/usr/local/include/opencv2
Linker添加库位置/usr/local/lib
Linker settings的Link libraries添加/usr/local/lib下opencv的那些.so文件。

测序程序如下:

#include <opencv2/opencv.hpp>
 using namespace cv;

int main()
{
    VideoCapture cap(0);
    if (!cap.isOpened())
    {
        return -1;
    }
    Mat frame;
    while (1)
    {
        cap >> frame;
        imshow("当前视频", frame);
        waitKey(10);
    }
    return 0;
}

讲完了codeblocks编译运行,接下来讲讲用make编译opencv工程。
Makefile如下:

SRC=$(shell find . -name "*.cpp")
OBJ=$(SRC:.c=.o)
OUT=test `pkg-config --libs opencv`
CC=g++

$(OUT):$(OBJ)  
    $(CC) $(OBJ) -o $(OUT)
clean:
    rm -rf $(OBJ) $(OUT)

新建一个文件夹,加入main.cpp及Makefile,然后在该目录下运行make,之后就会生成一个test文件。命令行再输入./test,这样项目项目就运行完毕了。如果想用树莓派做opencv的项目可以考虑用make的方法。

2019-09-09 11:43:56 Night___Raid 阅读数 37

本文介绍使用OpenCV自带的标定例程对单目摄像头标定的过程。

操作系统:Linux
OpenCV版本:3.2.0
摄像头:640×480像素,90度广角镜头

一、标定步骤

1、找到标定例程

进入OpenCV安装目录,找到samples/cpp/tutorial_code/calib3d/camera_calibration目录,把它拷贝到一个合适的位置。(因为可能需要修改一些代码,因此不建议直接在原目录下使用。)

2、修改标定配置参数

找到camera_calibration/in_VID5.xml文件,这是标定程序使用的配置文件,需要设置里面的几个参数。

  1. 棋盘格的宽度和高度。
<!-- Number of inner corners per a item row and column. (square, circle) -->
<BoardSize_Width>9</BoardSize_Width>
<BoardSize_Height>6</BoardSize_Height>

需要特别注意的是,这里的宽度和高度是指内部交叉点的个数,而不是方形格的个数。如下图所示的棋盘格,内部交叉点的宽度是9,高度是6。请务必填写正确,否则无法标定。

 

  1. 每格的宽度
    每格的宽度应设置为实际的毫米数,该参数的实际用途尚待考证。目前看来,即使设置的不准确也无大碍。
  <!-- The size of a square in some user defined metric system (pixel, millimeter)-->
  <Square_Size>20</Square_Size>
  1. 选择输入方式
    例程提供了三种输入方式。不过,如果待标定的摄像头已经接入电脑,建议使用input camera方式。该方式只需要设置视频输入设备号,对于笔记本电脑来说,通常0表示笔记本自带摄像头,1表示外接摄像头。
  <!-- The input to use for calibration. 
        To use an input camera -> give the ID of the camera, like "1"
        To use an input video  -> give the path of the input video, like "/tmp/x.avi"
        To use an image list   -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
        -->
<Input>"1"</Input>

3、编译

新建camera_calibration/CMakeLists.txt文件,写入如下内容。

project(Camera_Calibration)
set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV 3.0 QUIET)
if(NOT OpenCV_FOUND)
    find_package(OpenCV 2.4.3 QUIET)
    if(NOT OpenCV_FOUND)
        message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
    endif()
endif()

include_directories(${OpenCV_INCLUDE_DIR})
add_executable(Camera_Calibration camera_calibration.cpp)
target_link_libraries(Camera_Calibration ${OpenCV_LIBS})

编译

wjg@wjg-PC:camera_calibration/build$ cmake ..
wjg@wjg-PC:camera_calibration/build$ make

4、运行

运行时需要传入配置文件:

wjg@wjg-PC:camera_calibration/build$ Camera_Calibration ../in_VID5.xml

程序启动后会出现当前摄像头拍摄到的画面,右下角有操作提示。按下键盘'q'键开始标定。请务必使摄像头从不同方向拍摄棋盘格,以保证程序准确计算图像畸变。共拍摄25张照片后自动结束标定,标定结果写入camera_calibration/out_camera_data.xml。此时,为了查看标定效果,可以按下键盘'u'键,画面将切换到去畸变后的图像,如果畸变完全消除,则标定成功,否则应该重新标定。

这里有一些注意事项:

  • 可以直接在另一台电脑屏幕上显示棋盘格,而不必打印出来。屏幕上显示的棋盘格更平整,不会引入额外的误差。
  • 要在上下左右各个角度拍摄棋盘格,以减少各个图片间的相关性,有利于求解相机参数和畸变系数。

现在,就可以使用标定好的相机内参和畸变系数啦!

二、相机去畸变

有了标定好的参数,如何把输入图片的畸变去除呢?其实很简单,只需要调用OpenCV提供的一个函数就可以了:

cv::undistort(temp, frame, mK, mDistCoef);

其中,temp为原图片,frame为去畸变后的图片,mK为相机内参数矩阵,mDistCoef为畸变矩阵。后两个矩阵都可以在camera_calibration/out_camera_data.xml中找到。

三、理论知识——相机模型

光会用还不够,我们应该至少了解为什么需要标定,标定有什么用。

简单来说,标定是为了能够从空间点的像素坐标映射到世界坐标,这是3D立体视觉必须经过的过程。这一过程需要三步,第一步从畸变的像素坐标映射到去畸变的像素坐标,需要用到畸变矩阵mDistCoef;第二步从去畸变的像素坐标映射到相机坐标,需要用到相机内参数矩阵mK;第三步从相机坐标映射到世界坐标,需要用到相机外参数矩阵,也就是相机位姿变换矩阵。下图展示了第二步和第三步的过程。

关于更详细的理论知识,推荐阅读文末列出的参考资料。

四、参考资料

《视觉SLAM十四讲》第5讲 相机与图像 高翔
机器视觉的相机标定到底是什么? 知乎

2015-12-07 16:29:31 hero_myself 阅读数 1854

说明:在使用Tesseract 之前,一定要安装好Tesseract ,并在Project中配置好Tesseract 路径。

在自己的工程属性中VC++目录下增加包含目录和库目录,以便VS2010查找文件。例如:

包含目录:新增C:\Program Files\Tesseract-OCR\include\tesseract

库目录:新增C:\Program Files\Tesseract-OCR\include\lib

1. Tesseract 在C++中直接使用

// tess.cpp: 
// Recognize text on an image using Tesseract API and print it to the screen
// Usage: ./tess image.png

#include <tesseract/baseapi.h>
#include <tesseract/strngs.h>
#include <iostream>

int main(int argc, char** argv)
{
    if (argc != 2)
    {
        std::cout << "Please specify the input image!" << std::endl;
        return -1;
    }

    const char* lang = "eng";  //简体中文chi_sim
    const char* filename = argv[1];

    //新建tess基类
    tesseract::TessBaseAPI tess;

    //初始化
    tess.Init(NULL, lang, tesseract::OEM_DEFAULT);


    //设置识别模式
    tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);

    FILE* fin = fopen(filename, "rb");
    if (fin == NULL)
    {
        std::cout << "Cannot open " << filename << std::endl;
        return -1;
    }
    fclose(fin);

    STRING text;

    //进行识别
    if (!tess.ProcessPages(filename, NULL, 0, &text))
    {
        std::cout << "Error during processing." << std::endl;
        return -1;
    }
    else
        std::cout << text.string() << std::endl;

    return 0;
}
进行OCR识别的主题函数为tesseract::TessBaseAPI:: bool TessBaseAPI::ProcessPage(Pix* pix, int page_index, const char* filename,                                                                                                           const char* retry_config, int timeout_millisec,STRING* textout);            在分析流程时,专注此API,位置在baseapi.cpp

2. Tesseract同OpenCV结合使用

可以选择ROI然后进行OCR,为了识别cv::Mat矩阵,将其传递至TessBaseAPI::SetImage(); 使用TessBaseAPI::GetUTF8Text()得到识别后的文字。

// tesscv.cpp:
// Using Tesseract API with OpenCV

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <tesseract/baseapi.h>
#include <iostream>

int main(int argc, char** argv)
{
    // Usage: tesscv image.png
    if (argc != 2)
    {
        std::cout << "Please specify the input image!" << std::endl;
        return -1;
    }

    // Load image
    cv::Mat im = cv::imread(argv[1]);
    if (im.empty())
    {
        std::cout << "Cannot open source image!" << std::endl;
        return -1;
    }

    cv::Mat gray;
    cv::cvtColor(im, gray, CV_BGR2GRAY);
    // ...other image pre-processing here...

    // Pass it to Tesseract API
    tesseract::TessBaseAPI tess;
    tess.Init(NULL, "eng", tesseract::OEM_DEFAULT);
    tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);
    tess.SetImage((uchar*)gray.data, gray.cols, gray.rows, 1, gray.cols);

    // Get the text
    char* out = tess.GetUTF8Text();
    std::cout << out << std::endl;

    return 0;
}




没有更多推荐了,返回首页