opencv是图像处理库

2019-04-29 14:49:12 qq_40265379 阅读数 718

Opencv常用图像处理函数(C++)

1、图像翻转

//src:输入图片;dst:输出图片;flipCode >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转
cv::Mat src;
cv::Mat dst;
int flipCode;
cv::flip(src, dst, flipCode);

2、图像的旋转

第一步,根据旋转中心和旋转角度获取旋转矩阵

//center:旋转中心点;angle:旋转角度;scale:缩放因子
cv::Point2f center(x, y);
double angle;
double scale;
cv::getRotationMatrix2D(center, angle, scale);

第二步,根据旋转矩阵进行仿射变换,实现图像旋转

cv::Mat M = cv::getRotationMatrix2D(center, angle, 1);
//dsize:指定输出图像dst的尺寸
cv::Size dsize;
cv::warpAffine(src, dst, M, dsize);

3、空间颜色转换

//code:颜色映射码,格式为cv_src颜色空间2dst颜色空间,如CV_BGR2GRAY;dstCn:目标图像通道数,取0则由src和code决定
void cv::cvtColor(const cv::Mat &src, cv::Mat &dst, int code, int dstCn = 0 );

4、图像通道的分离与合并

//分离
vector<cv::Mat> channels;
cv::split(src, channels);
//合并
cv::merge(channels, dst);

5、图像平滑(常见滤波器)

//取ksize为5x5
//blur()函数:均值滤波,用ksize内像素的平均灰度值来代替中心点的灰度值
cv::blur(src, dst, cv::Size(5, 5));
//medianBlur()函数:中值滤波,用ksize内所有像素的中值代替中心点的灰度值
cv::medianBlur(src, dst, 5);
//GaussianBlur()函数:高斯滤波,ksize内的像素根据与中心点像素的位置关系被赋予不同的权值
double sigmaX;//高斯核函数在X方向的的标准偏差
double sigmaY;//高斯核函数在Y方向的的标准偏差,若sigmaY=0,则设为sigmaX,若sigmaX和sigmaY都是0则由ksize的宽高计算得出
cv::GaussianBlur(src, dst, cv::Size(5, 5), sigmaX, sigmaY);
2017-12-11 10:33:37 wenwang88 阅读数 1346

前言:opencv是一个开源的图像处理库,它支持Linux系统。S5P6818是三星八核Cortex-A53的CPU,现在我们来配置、编译、安装opencv-2.4.9图像处理库。


一、环境

硬件:这里选用友善之臂NANOPC-T3开发板

软件:Debian系统

二、准备工作

    1. 软件更新

          (1) fa@NanoPi3:~/work$     sudo apt-get update  

    2. 安装cmake-gui和unzip解压工具

          (1) fa@NanoPi3:~/work$     sudo apt-get install cmake-gui 

          (2) fa@NanoPi3:~/work$     sudo apt-get install unzip   

    3. 下载opencv-2.4.9源码,可以到官网下载或者到我的资源下载opencv_test在windows上解压后可以得到

          链接:http://download.csdn.net/download/wenwang88/10154796        

    4. 在linux系统上解压opencv-2.4.9源码

          (1) fa@NanoPi3:~/work$     unzip opencv-2.4.9.zip  

    5.创建两个目录build和temp,build存放Makefile等文件,temp存放编译出来的opencv库文件

          (1) fa@NanoPi3:~/work$    mkdir build 

          (2) fa@NanoPi3:~/work$    mkdir temp  


三、 使用cmake配置,生成Makefile等文件

    1. 打开cmake图形界面程序


    2. 指定opencv-2.4.9源码目录和存放cmake生成的工程文件目录



    3. 选择编译器类型


    4. 第一次配置



    5. 选择opencv库的安装目录



    6. 增加WITH_OPENMP这个配置项,支持openmp



    7. 同理,去掉WITH_FFMPEG、WITH_TIFF这两个选项


    8. 第二次配置



   9. 生成Makefile等文件



四、编译和安装opencv库

    1. 编译   

          (1) fa@NanoPi3:~/work$         cd build 

          (2) fa@NanoPi3:~/work/build$   make  


    2. 安装

          (1) fa@NanoPi3:~/work/build$   make install  


    3. 复制opencv库文件到指定的目录,以后供编译应用程序使用

          (1) fa@NanoPi3:~/work/build$   cd ../temp/ 

          (2) fa@NanoPi3:~/work/temp$    sudo cp lib/* /usr/lib/ -rfd 

          (3) fa@NanoPi3:~/work/temp$    sudo cp lib/* /lib/arm-linux-gnueabihf -rfd 

          (4) fa@NanoPi3:~/work/temp$    sudo cp lib/* /usr/lib/arm-linux-gnueabihf/ -rfd 

          (5) fa@NanoPi3:~/work/temp$    sudo cp include/* /usr/include -rf  


五、测试

   1. 源码identifity.cpp

  1. #include "opencv2/highgui/highgui.hpp"  
  2. #include "opencv2/imgproc/imgproc.hpp"  
  3. #include <opencv2/opencv.hpp>  
  4. #include <stdio.h>  
  5. #include <sys/time.h>  
  6. #include <omp.h>  
  7. #include <unistd.h>  
  8.   
  9. using namespace std;  
  10. using namespace cv;  
  11.   
  12. #define DEBUG 1  
  13. #if DEBUG  
  14. struct timeval tPreTime ;  
  15. struct timeval tCurTime ;  
  16. long delta;  
  17. #endif  
  18.   
  19. int main(int argc, char** argv)  
  20. {     
  21.     Mat srcimage;  
  22.     Mat hsvimage;  
  23.     Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));  
  24.   
  25.     while (1)  
  26.     {  
  27.         srcimage =imread("test.jpg");  
  28. #if DEBUG  
  29.         gettimeofday(&tCurTime, NULL);   
  30. #endif        
  31.         if (srcimage.empty())  
  32.         {  
  33.             printf("srcimage.empty()\n");         
  34.             continue;  
  35.         }  
  36.   
  37.         cvtColor(srcimage, hsvimage, COLOR_BGR2HSV);  
  38.   
  39.         //二值化  
  40.         inRange(hsvimage, Scalar(25, 25, 130), Scalar(150, 240, 255), hsvimage);  
  41.   
  42.         erode(hsvimage, hsvimage, element);  
  43.         dilate(hsvimage, hsvimage, element);  
  44.         imshow("srcimage", srcimage);   
  45.         imshow("hsvimage", hsvimage);   
  46.         waitKey(1);               
  47. #if DEBUG  
  48.         gettimeofday(&tPreTime, NULL);   
  49.             delta =  ( tPreTime.tv_sec - tCurTime.tv_sec ) *1000 + (tPreTime.tv_usec -tCurTime.tv_usec)  /1000;             
  50.         printf("process one frame: %ld\n",delta);         
  51. #endif  
  52.     }  
  53.     return 0;  
  54. }  


2. 编译、执行

          (1) fa@NanoPi3:~/work/test$     g++ identifity.cpp -o identifity -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_ml -lpthread 

          (2) fa@NanoPi3:~/work/test$     ./identifity  


   3. 查看进程IP

          (1) fa@NanoPi3:~/work/test$    ps -aux | grep identifity 

          (2) fa        1365  228  0.6  68464  5964 pts/0    Sl+  22:30   0:04 ./identifity 

               fa        1372  0.0  0.0   4132   780 pts/3    S+   22:30   0:00 grep identifity  




附上效果图

2018-02-01 21:23:36 github_30605157 阅读数 3315

OpenCV是学习数字图像处理的好工具,本专栏拟打算从对OpenCV源码的学习来研究数字图像处理中的基本操作。我开设本专栏不为别的,只希望能系统地学习OpenCV,并把我支离破碎的数字图像处理知识好好理一理。当然,最终还是为了我的毕设啦!这是我大学的最后一个作品了,我希望能有一个好的结果。

因此,本专栏的所有文章相当于我的学习笔记,内容仅供参考,也欢迎各位批评指正。

OpenCV

OpenCV是一个开源跨平台的计算机视觉函数库,它提供了各种图像处理的操作,我们可以不掌握数字图像处理的知识,就可以使用这个函数库,因此它为我们的编程提供了很大的便利。

笔者在以前在安装OpenCV时吃了不少苦头,遇到过各种各样的问题,这里也略作总结:

  • 与VS的版本兼容问题

由于OpenCV在更新,而VS也在更新,这就导致了二者很难保持一致。在OpenCV的路径中你会发现类似于这样的文件夹:

opencv-vs

其中“vc10”、“vc11”、“vc12”就分别对应VS的版本,即VS2010、VS2012、VS2013(vc14对应的是VS2015),倘若你下载的OpenCV中没有与你的VS对应版本的文件夹的话,那二者就不能兼容。

  • 程序的位数和编译模式问题

其实这实际上是配置上的问题了。下面是VS的“Property Manager”的配置窗口:

property-manager

这个窗口的信息很直观,就是说你有四种配置方式:Debug编译模式+32位程序、Debug编译模式+64位程序、Release编译模式+32位程序、Release编译模式+64位程序。所以配置的时候,你需要注意选择合适的路径和动态链接库,如你想配置Debug编译模式+32位程序,你就需要选择x86的文件夹和后面带有d的动态链接库了。

x86

debug

当然,配置正确了也不能保证万事大吉,你还需要在VS中设置编译模式:

build-mode

这里需要和前面的配置保持一致。

上面我就总结了两种比较常见也比较致命的问题,其他细节问题这里就不赘述了。

在本专栏中,我拟打算学习一下OpenCV中某些部分的源码,另外也会介绍一些函数的原理,当然这就很可能涉及到数字图像处理方面的知识了。

数字图像处理

关于数字图像处理的介绍可以参考经典的图像处理的图书,如冈萨雷斯的《数字图像处理》一书。其中这样介绍数字图像处理:

数字图像处理是指借助于数字计算机来处理数字图像。注意,数字图像是由有限数量的元素组成,每个元素都有一个特定的位置和幅值。

其中,对数字图像处理的历史、相关领域等做了详细的介绍,感兴趣的可以去看看。

专栏图片

专栏还需要上传一张图片,我不知道要选什么图片,就将OpenCV安装路径中的几个图片经过缩放、组合成了一张长图上传到了上面。

// column_intro.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
    if (argc < 2)
    {
        cout << "No arguments found!" << endl;
        return -1;
    }
    //cout << argc << endl;
    float frame_wd = 1110, frame_hg = 170;
    Mat frame = Mat::zeros(frame_hg, frame_wd, CV_8U);

    Mat scale_mat = Mat::zeros(2, 3, CV_32FC1);
    float scale_factor;
    Mat img, rst;
    // the distance of every image move in loop
    float pitch = 0.0;

    for (int i = 0; i < argc - 1; i++)
    {
        img = imread(argv[i + 1], CV_LOAD_IMAGE_GRAYSCALE);
        // get scale factor
        scale_factor = frame_hg / img.size().height;
        // get scale matrix
        scale_mat.at<float>(0) = scale_factor;
        scale_mat.at<float>(4) = scale_factor;
        // get size of result
        Size sz(img.size().width * scale_factor,
            img.size().height * scale_factor);
        warpAffine(img, rst, scale_mat, sz);

        if (pitch + rst.size().width < frame.size().width)
        {
            rst.copyTo(frame(Rect(pitch, 0, rst.size().width, frame_hg)));
            pitch += rst.size().width;
        }
        else
        {
            rst(Rect(0, 0, frame_wd - pitch, frame_hg)).
                copyTo(frame(Rect(pitch, 0, frame_wd - pitch, frame_hg)));
        }
    }

    // write the result into file
    imwrite("result.png", frame);
    return 0;
}

在我的github或者gitee里可以下载该代码。

很久没有写博客了。作为我的2018年第一篇博客,内容可能有点儿仓促,后面我会根据实际需要进行适当改动。

参考资料

  1. 数字图像处理,冈萨雷斯,电子工业出版社
  2. 维基百科:OpenCV
2014-08-18 11:20:09 CNHK1225 阅读数 892

1.OpenCV的全称是:Open Source Computer Vision Library 实现了图像处理和计算机视觉方面的很多通用算法。应用于人机互动/物体识别/图象分割/人脸识别/动作识别/运动跟踪/机器人;

2.参考网址

OpenCV中文网站:http://www.opencv.org.cn/

 中文论坛: http://www.opencv.org.cn/forum/  

2020-01-04 23:09:35 m0_38106923 阅读数 88997

目录

1、导入库文件

2、设计GUI

3、调用摄像头

4、实时图像处理

4.1、阈值二值化

4.2、边缘检测

4.3、轮廓检测

4.4、高斯滤波

4.5、色彩转换

4.6、调节对比度

5、退出系统


初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试有一定帮助,项目演示效果如下:

0c2d9990a4eb18b78e8969fa40345a36232b20c0.jpg

1、导入库文件

这里主要使用PySimpleGUI、cv2和numpy库文件,PySimpleGUI库文件实现GUI可视化,cv2库文件是Python的OpenCV接口文件,numpy库文件实现数值的转换和运算,均可通过pip导入。

import PySimpleGUI as sg  #pip install pysimplegui
import cv2  #pip install opencv-python
import numpy as np #pip install numpy

2、设计GUI

基于PySimpleGUI库文件实现GUI设计,本项目界面设计较为简单,设计800X400尺寸大小的框图,浅绿色背景,主要由摄像头界面区域和控制按钮区域两部分组成。效果如下所示:

GUI代码如下所示:

    #背景色
    sg.theme('LightGreen')

    #定义窗口布局
    layout = [
      [sg.Image(filename='', key='image')],
      [sg.Radio('None', 'Radio', True, size=(10, 1))],
      [sg.Radio('threshold', 'Radio', size=(10, 1), key='thresh'),
       sg.Slider((0, 255), 128, 1, orientation='h', size=(40, 15), key='thresh_slider')],
      [sg.Radio('canny', 'Radio', size=(10, 1), key='canny'),
       sg.Slider((0, 255), 128, 1, orientation='h', size=(20, 15), key='canny_slider_a'),
       sg.Slider((0, 255), 128, 1, orientation='h', size=(20, 15), key='canny_slider_b')],
      [sg.Radio('contour', 'Radio', size=(10, 1), key='contour'),
       sg.Slider((0, 255), 128, 1, orientation='h', size=(20, 15), key='contour_slider'),
       sg.Slider((0, 255), 80, 1, orientation='h', size=(20, 15), key='base_slider')],
      [sg.Radio('blur', 'Radio', size=(10, 1), key='blur'),
       sg.Slider((1, 11), 1, 1, orientation='h', size=(40, 15), key='blur_slider')],
      [sg.Radio('hue', 'Radio', size=(10, 1), key='hue'),
       sg.Slider((0, 225), 0, 1, orientation='h', size=(40, 15), key='hue_slider')],
      [sg.Radio('enhance', 'Radio', size=(10, 1), key='enhance'),
       sg.Slider((1, 255), 128, 1, orientation='h', size=(40, 15), key='enhance_slider')],
      [sg.Button('Exit', size=(10, 1))]
    ]

    #窗口设计
    window = sg.Window('OpenCV实时图像处理',
               layout,
               location=(800, 400),
               finalize=True)

3、调用摄像头

打开电脑内置摄像头,将数据显示在GUI界面上,效果如下所示:

代码如下所示:

    #打开内置摄像头
    cap = cv2.VideoCapture(0)
    while True:
        event, values = window.read(timeout=0, timeout_key='timeout')

        #实时读取图像
        ret, frame = cap.read()

        #GUI实时更新
        imgbytes = cv2.imencode('.png', frame)[1].tobytes()
        window['image'].update(data=imgbytes)

    window.close()

4、实时图像处理

4.1、阈值二值化

进行阈值二值化操作,大于阈值values['thresh_slider']的,使用255表示,小于阈值values['thresh_slider']的,使用0表示,效果如下所示:

 代码如下所示:

if values['thresh']:
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)[:, :, 0]
    frame = cv2.threshold(frame, values['thresh_slider'], 255, cv2.THRESH_BINARY)[1]

4.2、边缘检测

进行边缘检测,values['canny_slider_a']表示最小阈值,values['canny_slider_b']表示最大阈值,效果如下所示:

代码如下所示:

if values['canny']:
    frame = cv2.Canny(frame, values['canny_slider_a'], values['canny_slider_b'])

4.3、轮廓检测

轮廓检测是形状分析和物体检测和识别的有用工具,连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度,效果如下所示:

 代码如下所示:

if values['contour']:
    hue = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    hue = cv2.GaussianBlur(hue, (21, 21), 1)
    hue = cv2.inRange(hue, np.array([values['contour_slider'], values['base_slider'], 40]),
                      np.array([values['contour_slider'] + 30, 255, 220]))
    cnts= cv2.findContours(hue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
    cv2.drawContours(frame, cnts, -1, (0, 0, 255), 2)

4.4、高斯滤波

进行高斯滤波,(21, 21)表示高斯矩阵的长与宽都是21,标准差取values['blur_slider'],效果如下所示:

 代码如下所示:

if values['blur']:
    frame = cv2.GaussianBlur(frame, (21, 21), values['blur_slider'])

4.5、色彩转换

色彩空间的转化,HSV转换为BGR,效果如下所示:

 代码如下所示:

if values['hue']:
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    frame[:, :, 0] += int(values['hue_slider'])
    frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)

4.6、调节对比度

增强对比度,使图像中的细节看起来更加清晰,效果如下所示:

  代码如下所示:

if values['enhance']:
    enh_val = values['enhance_slider'] / 40
    clahe = cv2.createCLAHE(clipLimit=enh_val, tileGridSize=(8, 8))
    lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)
    lab[:, :, 0] = clahe.apply(lab[:, :, 0])
    frame = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)

5、退出系统

直接break即可跳出循环。

if event == 'Exit' or event is None:
    break

拓展学习:基于Python的人工智能美颜系统 

请关注公众号,回复关键字:OpenCV实时图像处理,获取项目资源。