几个简单的OpenCV程序
OpenCV官网:https://opencv.org/
百度百科
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby的支持。
所有新的开发和算法都是用C++接口。一个使用CUDA的GPU接口也于2010年9月开始实现。
下面转载几个OpenCV的程序。
我的环境:
$ pkg-config --modversion opencv
2.4.13
$ uname -a
Linux toa 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
1.显示图片https://www.cnblogs.com/Crysaty/p/6638152.html
#include <highgui.h> int main(int argc,char ** argv)
{ IplImage* img = cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR); cvNamedWindow("Image_show",CV_WINDOW_AUTOSIZE); cvShowImage("Image_show",img); cvWaitKey(0); cvReleaseImage(&img); cvDestroyWindow("Image_show"); return 0;
}
编译运行:
$ make
gcc main.c `pkg-config --cflags --libs opencv`
$ ./a.out ../windows.png
效果图(左),原图(右):
一个C++的代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{ Mat imggray=imread(argv[1],CV_LOAD_IMAGE_COLOR); cvtColor(imggray,imggray,CV_RGB2GRAY);//RGB2GRAYimshow("123",imggray);//显示图片 waitKey(0);return 1;
}
编译与运行:
$ make
g++ main.c `pkg-config --cflags --libs opencv`
$ ./a.out ../wongrgb.jpg
2.二值图+轮廓图https://www.cnblogs.com/always-chang/p/6170859.html
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
IplImage *g_pGrayImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图";
const char *pstrWindowsOutLineTitle = "轮廓图";
CvSeq *g_pcvSeq = NULL;void on_trackbar(int pos)
{// 转为二值图 IplImage *pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);cvThreshold(g_pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);// 显示二值图 cvShowImage(pstrWindowsBinaryTitle, pBinaryImage);CvMemStorage* cvMStorage = cvCreateMemStorage();// 检索轮廓并返回检测到的轮廓的个数 cvFindContours(pBinaryImage, cvMStorage, &g_pcvSeq);IplImage *pOutlineImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 3);int _levels = 5;cvZero(pOutlineImage);cvDrawContours(pOutlineImage, g_pcvSeq, CV_RGB(255, 0, 0), CV_RGB(0, 255, 0), _levels);cvShowImage(pstrWindowsOutLineTitle, pOutlineImage);cvReleaseMemStorage(&cvMStorage);cvReleaseImage(&pBinaryImage);cvReleaseImage(&pOutlineImage);
}int main(int argc, char** argv)
{const char *pstrWindowsSrcTitle = "原图";const char *pstrWindowsToolBarName = "二值化";// 从文件中加载原图 IplImage *pSrcImage = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);// 显示原图 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsSrcTitle, pSrcImage);// 转为灰度图 g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);// 创建二值图和轮廓图窗口 cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsOutLineTitle, CV_WINDOW_AUTOSIZE);// 滑动条 int nThreshold = 0;cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);on_trackbar(1);cvWaitKey(0);cvDestroyWindow(pstrWindowsSrcTitle);cvDestroyWindow(pstrWindowsBinaryTitle);cvDestroyWindow(pstrWindowsOutLineTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&g_pGrayImage);return 0;
}
编译与运行:
$ make
g++ main.c `pkg-config --cflags --libs opencv`
$ ./a.out ../wong.jpg
效果图:
3.鼠标绘图https://www.cnblogs.com/always-chang/p/6170859.html
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
const char *pstrWindowsMouseDrawTitle = "鼠标绘图";
// 鼠标消息的回调函数
void on_mouse(int event, int x, int y, int flags, void* param)
{static bool s_bMouseLButtonDown = false;static CvPoint s_cvPrePoint = cvPoint(0, 0);switch (event){case CV_EVENT_LBUTTONDOWN:s_bMouseLButtonDown = true;s_cvPrePoint = cvPoint(x, y);break;case CV_EVENT_LBUTTONUP:s_bMouseLButtonDown = false;break;case CV_EVENT_MOUSEMOVE:if (s_bMouseLButtonDown){CvPoint cvCurrPoint = cvPoint(x, y);cvLine((IplImage*)param, s_cvPrePoint, cvCurrPoint, CV_RGB(0, 0, 20), 3);s_cvPrePoint = cvCurrPoint;cvShowImage(pstrWindowsMouseDrawTitle, (IplImage*)param);}break;}
}
int main()
{const int MAX_WIDTH = 500, MAX_HEIGHT = 400;const char *pstrSaveImageName = "Draw.jpg";IplImage *pSrcImage = cvCreateImage(cvSize(MAX_WIDTH, MAX_HEIGHT), IPL_DEPTH_8U, 3);cvSet(pSrcImage, CV_RGB(255, 255, 255)); //可以用cvSet()将图像填充成白色 cvNamedWindow(pstrWindowsMouseDrawTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);cvSetMouseCallback(pstrWindowsMouseDrawTitle, on_mouse, (void*)pSrcImage);int c;do{c = cvWaitKey(0);switch ((char)c){case 'r'://r重画cvSet(pSrcImage, CV_RGB(255, 255, 255));cvShowImage(pstrWindowsMouseDrawTitle, pSrcImage);break;case 's'://s保存图像cvSaveImage(pstrSaveImageName, pSrcImage);break;}} while (c > 0 && c != 27);cvDestroyWindow(pstrWindowsMouseDrawTitle);cvReleaseImage(&pSrcImage);return 0;
}
编译与运行:
$ make
g++ main.c `pkg-config --cflags --libs opencv`
$ ./a.out
效果图:
4.灰度直方图https://www.cnblogs.com/always-chang/p/6170859.html
#include <opencv2/opencv.hpp>
#include <opencv2/legacy/compat.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") void FillWhite(IplImage *pImage)
{cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);
}
// 创建灰度图像的直方图
CvHistogram* CreateGrayImageHist(IplImage **ppImage)
{int nHistSize = 256;float fRange[] = { 0, 255 }; //灰度级的范围 float *pfRanges[] = { fRange };CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);cvCalcHist(ppImage, pcvHistogram);return pcvHistogram;
}
// 根据直方图创建直方图图像
IplImage* CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram)
{IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);FillWhite(pHistImage);//统计直方图中的最大直方块 float fMaxHistValue = 0;cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);//分别将每个直方块的值绘制到图中 int i;for (i = 0; i < nImageWidth; i++){float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小 int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight); //要绘制的高度 cvRectangle(pHistImage,cvPoint(i * nScale, nImageHeight - 1),cvPoint((i + 1) * nScale - 1, nImageHeight - nRealHeight),cvScalar(i, 0, 0, 0),CV_FILLED);}return pHistImage;
}
int main(int argc, char** argv)
{const char *pstrWindowsSrcTitle = "原图";const char *pstrWindowsGrayTitle = "灰度图";const char *pstrWindowsHistTitle = "直方图";// 从文件中加载原图 IplImage *pSrcImage = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);// 灰度图 cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);// 灰度直方图 CvHistogram *pcvHistogram = CreateGrayImageHist(&pGrayImage);// 创建直方图图像 int nHistImageWidth = 255;int nHistImageHeight = 150; //直方图图像高度 int nScale = 2;IplImage *pHistImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogram);// 显示 cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsHistTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsSrcTitle, pSrcImage);cvShowImage(pstrWindowsGrayTitle, pGrayImage);cvShowImage(pstrWindowsHistTitle, pHistImage);cvWaitKey(0);cvReleaseHist(&pcvHistogram);cvDestroyWindow(pstrWindowsSrcTitle);cvDestroyWindow(pstrWindowsGrayTitle);cvDestroyWindow(pstrWindowsHistTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&pGrayImage);cvReleaseImage(&pHistImage);return 0;
}
编译与运行:
$ make
g++ main.c `pkg-config --cflags --libs opencv`
$ ./a.out ../wongrgb.jpg
效果图:
5.灰度直方图均衡化
#include <opencv2/opencv.hpp>
#include <opencv2/legacy/compat.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
void FillWhite(IplImage *pImage)
{cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);
}
// 创建灰度图像的直方图
CvHistogram* CreateGrayImageHist(IplImage **ppImage)
{int nHistSize = 256;float fRange[] = { 0, 255 }; //灰度级的范围 float *pfRanges[] = { fRange };CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);cvCalcHist(ppImage, pcvHistogram);return pcvHistogram;
}
// 根据直方图创建直方图图像
IplImage* CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram)
{IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);FillWhite(pHistImage);//统计直方图中的最大直方块 float fMaxHistValue = 0;cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);//分别将每个直方块的值绘制到图中 int i;for (i = 0; i < nImageWidth; i++){float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小 int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight); //要绘制的高度 cvRectangle(pHistImage,cvPoint(i * nScale, nImageHeight - 1),cvPoint((i + 1) * nScale - 1, nImageHeight - nRealHeight),cvScalar(i, 0, 0, 0),CV_FILLED);}return pHistImage;
}
int main(int argc, char** argv)
{const char *pstrWindowsSrcTitle = "原图";const char *pstrWindowsGrayTitle = "灰度图";const char *pstrWindowsHistTitle = "直方图";const char *pstrWindowsGrayEqualizeTitle = "灰度图-均衡化后";const char *pstrWindowsHistEqualizeTitle = "直方图-均衡化后";// 从文件中加载原图 IplImage *pSrcImage = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);IplImage *pGrayEqualizeImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);// 灰度图 cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);// 直方图图像数据 int nHistImageWidth = 255;int nHistImageHeight = 150;int nScale = 2;// 灰度直方图及直方图图像 CvHistogram *pcvHistogram = CreateGrayImageHist(&pGrayImage);IplImage *pHistImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogram);// 均衡化 cvEqualizeHist(pGrayImage, pGrayEqualizeImage);// 均衡化后的灰度直方图及直方图图像 CvHistogram *pcvHistogramEqualize = CreateGrayImageHist(&pGrayEqualizeImage);IplImage *pHistEqualizeImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogramEqualize);// 显示cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsHistTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsGrayEqualizeTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsHistEqualizeTitle, CV_WINDOW_AUTOSIZE);//显示代码….cvShowImage(pstrWindowsGrayTitle, pGrayImage);//显示灰度图cvShowImage(pstrWindowsHistTitle, pHistImage);//显示灰度直方图cvShowImage(pstrWindowsGrayEqualizeTitle, pGrayEqualizeImage);//显示均衡化后的灰度图cvShowImage(pstrWindowsHistEqualizeTitle, pHistEqualizeImage);//显示均衡化后的灰度直方图//显示代码….cvWaitKey(0);//回收资源代码…cvDestroyWindow(pstrWindowsGrayTitle);cvDestroyWindow(pstrWindowsHistTitle);cvDestroyWindow(pstrWindowsGrayEqualizeTitle);cvDestroyWindow(pstrWindowsHistEqualizeTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&pHistImage);cvReleaseImage(&pGrayEqualizeImage);cvReleaseImage(&pHistEqualizeImage);return 0;
}
编译与运行:
$ make
g++ main.c `pkg-config --cflags --libs opencv`
$ ./a.out ../wongrgb.jpg
效果图:
6.彩色直方图均衡化
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
//彩色图像的直方图均衡化
IplImage* EqualizeHistColorImage(IplImage *pImage)
{IplImage *pEquaImage = cvCreateImage(cvGetSize(pImage), pImage->depth, 3);// 原图像分成各通道后再均衡化,最后合并即彩色图像的直方图均衡化 const int MAX_CHANNEL = 4;IplImage *pImageChannel[MAX_CHANNEL] = { NULL };int i;for (i = 0; i < pImage->nChannels; i++)pImageChannel[i] = cvCreateImage(cvGetSize(pImage), pImage->depth, 1);cvSplit(pImage, pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3]);for (i = 0; i < pImage->nChannels; i++)cvEqualizeHist(pImageChannel[i], pImageChannel[i]);cvMerge(pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3], pEquaImage);for (i = 0; i < pImage->nChannels; i++)cvReleaseImage(&pImageChannel[i]);return pEquaImage;
}
int main(int argc, char** argv)
{const char *pstrWindowsSrcTitle = "原图";const char *pstrWindowsHisEquaTitle = "直方图均衡化后";// 从文件中加载原图 IplImage *pSrcImage = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);IplImage *pHisEquaImage = EqualizeHistColorImage(pSrcImage);cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsHisEquaTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsSrcTitle, pSrcImage);cvShowImage(pstrWindowsHisEquaTitle, pHisEquaImage);cvWaitKey(0);cvDestroyWindow(pstrWindowsSrcTitle);cvDestroyWindow(pstrWindowsHisEquaTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&pHisEquaImage);return 0;
}
编译与运行:
$ make
g++ main.c `pkg-config --cflags --libs opencv`
$ ./a.out ../wongrgb.jpg
效果图(效果也不太好啊):
更多操作示例:https://blog.csdn.net/qq_35874394/article/details/53290370
几个简单的OpenCV程序相关推荐
- 第一个Qt+opencv程序
简单安装好Qt和编译安装好opencv后,简单实现第一个Qt+opencv程序:读取并显示一张图片,这里我的Qt版本时5.9.1,opencv版本是4.0.1,版本的影响不大. 首先我们用Qt创建一个 ...
- 子程序调用与宏定义的异同_如何用数控系统进行简单的宏程序调用?老师傅告诉你,用G65就行...
什么是简单调用?很多人都不知道吧,如果想要深入操作宏, 就先要学会变量,学会变量之担,再去操作宏,就会变得非常的简单,今天给大家分享如何用G65进行简单的宏程序调用. 用户宏的简单宏调用是指在主程序中 ...
- 小程序生命周期_来,简单说说小程序的生命周期?
简单说说小程序的生命周期? 在小程序中生命周期分为三大类 应用生命周期 页面生命周期 组件生命周期 应用生命周期 onLaunch(){ console.log('onLaunch监听小程序初始化') ...
- 编写运行最简单的java程序——使用记事本编写java程序
编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...
- 用java做一个简单记事本_用记事本写一个简单的java程序
用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...
- matlab简单程序实例_visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)...
近期疫情原因,工作比较不忙,所以打算出一套零基础,VB.NET实例系列入门教程,实用又好玩,带大家进入VB的编程世界里,希望这套图文教程能帮到有需要的人! 第一节(简单实用抽奖程序) 内容准备:编译环 ...
- BizTalk 2006 简单入门示例程序(附源项目文件下载)
BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...
- JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...
用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...
最新文章
- 为什么深度学习不能取代传统的计算机视觉技术?
- OS / Linux / 进程的虚拟地址空间布局
- php stripcslashes 转义,stripcslashes()
- Java中符号位扩展
- atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform
- R语言从入门到精通Day2之【R语言软件下载与安装】
- resnet34\resnet101网络结构图
- 菲尼克斯电源模块QUINT-PS3AC24DC40的组装说明
- 【产品设计-小程序】小胖工具箱系列—汇率换算
- php修改服务器ip地址,php修改服务器ip地址
- 微信小程序学习第8天——自定义组件的数据监听器Observer小案例
- python数据分析师书籍_做数据分析不得不看的书有哪些?
- TF-A中的工具介绍
- 进入外包公司之后…………
- 就是用计算机判断一个句子的语义,英语汉语词汇语义及句子结构对比
- 鲁迅文章的语言特色浅谈
- FM33G0系列之低功耗
- JAVA简单实现坦克对战(只有坦克和子弹)
- 动态SQL之choose、when、otherwise标签
- perl的Math::Combinatorics模块实现全排列
热门文章
- 在gitLab上新建仓库push时SSHkey的问题
- 如何开启开源之旅(一)
- 大数据到底在用什么姿势塑造我们?
- c# dynamic动态类型和匿名类
- FMDB数据库框架的是使用
- 对象指针与this指针
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许...
- python音频特征提取_使用Python对音频进行特征提取
- python读hadoop_python读取hdfs并返回dataframe教程
- sql 相加_Java整数相加溢出怎么办?Java 8 还是厉害!