Opencv几个经典的入门级程序
来源:互联网 发布:淘宝嘉年华报名流程 编辑:程序博客网 时间:2024/06/01 21:57
灰度化处理图像主要用到plImage* cvCreateImage( CvSize size, int depth, int channels )相当于如下的步骤:header = cvCreateImageHeader(size,depth,channels);cvCreateData(header);具体的代码如下:
#include "cv.h"#include "highgui.h"int main( int argc, char** argv ){ IplImage* pImg; //声明图像结构体 if( argc == 3 &&(pImg = cvLoadImage( argv[1], 0)) != 0 ) { IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);//强制转换为Gray cvCopy(pImg, pImg2, NULL);//指针重定向 cvSaveImage(argv[2], pImg2);//存入图像 cvNamedWindow( "Image", 1 );//命名显示窗口 cvShowImage( "Image", pImg );//显示图像 cvWaitKey(0); //程序暂停,等待用户触发一个按键动作 cvDestroyWindow( "Image" );//销毁窗口 cvReleaseImage( &pImg ); //释放图片占有的内存 return 0; } return -1;}
编译:
g++ -ggdb `pkg-config opencv --cflags --libs` gray.c -o gray执行 :
./gray ../picture/lena.jpg gray.jpg
原图:
效果图:
边缘检测:
使用到的函数为:
void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture size=3 );
各参数的含义如下:
image 单通道输入图像.
edgee 单通道存储边缘的输出图像
threshold1 第一个阈值
threshold2 第二个阈值
aperture_size Sobel 算子内核大小
函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。cvCanny只接受单通道图像作为输入,故载入图像时,cvLoadImage(SRC,iscolor),第二个参数必须设为0.
#include "cv.h"#include "cxcore.h"#include "highgui.h"int main( int argc, char** argv ){ //初始化图像指针 IplImage* pImg = NULL; IplImage* pCannyImg = NULL; if( argc == 2 &&(pImg =cvLoadImage(argv[1], 0)) != 0 )//选择单通道输入 { pCannyImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1); //对图像进行边缘检测 cvCanny(pImg, pCannyImg, 50, 150, 3); //命名窗口 cvNamedWindow("src", 1); cvNamedWindow("canny",1); //显示 cvShowImage( "src", pImg ); cvShowImage( "canny", pCannyImg ); cvWaitKey(0); cvDestroyWindow( "src" ); cvDestroyWindow( "canny" ); cvReleaseImage( &pImg ); cvReleaseImage( &pCannyImg ); return 0; } return -1;}
编译:
g++ -ggdb `pkg-config opencv --cflags --libs` canny.c -o canny执行 :
./canny ../../../../../Pictures/wolf.jpg效果图:
轮廓检测
函数模型如下:
int cvFindContours( CvArr* image, CvMemStorage* storage,CvSeq** first contour, int header size=sizeof(CvContour),int mode=CV RETR LIST, int method=CV CHAIN APPROX SIMPLE,CvPoint offset=cvPoint(0,0) );
测试代码如下:
#include "cv.h"#include "cxcore.h"#include "highgui.h"int main( int argc, char** argv ){ //初始化指针 IplImage* pImg = NULL; IplImage* pContourImg = NULL; CvMemStorage * storage = cvCreateMemStorage(0); CvSeq * contour = 0; int mode = CV_RETR_EXTERNAL; if( argc == 3) if(strcmp(argv[2], "all") == 0) mode = CV_RETR_CCOMP; //ÄÚÍâÂÖÀª¶¼¼ì²â cvNamedWindow("src", 1); cvNamedWindow("contour",1); if( argc >= 2 && (pImg = cvLoadImage( argv[1], 0)) != 0 ) { cvShowImage( "src", pImg ); pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3); //copy source image and convert it to BGR image cvCvtColor(pImg, pContourImg, CV_GRAY2BGR); cvFindContours( pImg, storage, &contour, sizeof(CvContour),mode, CV_CHAIN_APPROX_SIMPLE); } else { cvDestroyWindow( "src" ); cvDestroyWindow( "contour" ); cvReleaseMemStorage(&storage); return -1; } cvDrawContours(pContourImg, contour, CV_RGB(0,0,255), CV_RGB(255, 0, 0),2, 2, 8); cvShowImage( "contour", pContourImg ); cvWaitKey(0); cvDestroyWindow( "src" ); cvDestroyWindow( "contour" ); cvReleaseImage( &pImg ); cvReleaseImage( &pContourImg ); cvReleaseMemStorage(&storage); return 0;}编译运行后的效果如下图:
- Opencv几个经典的入门级程序
- python几个简单的入门程序
- 一个经典的 JAVA ME 手机程序入门级源码
- [JavaFx]经典的扫雷程序入门
- 算法竞赛入门经典几个有意思的问题
- 初步学习opencv的几个程序示例 学习笔记
- 分享几个经典C程序
- 几个经典的游戏
- 几个经典的博弈
- 几个经典的博弈
- 几个经典的SQL
- 几个经典的博弈
- 几个经典的故事
- 几个经典的故事
- 【OpenCV入门指南】第一个OpenCV程序
- opencv入门程序晒一个~~~
- Winsock开发网络通信程序的经典入门
- Winsock开发网络通信程序的经典入门
- android多国语言使用
- Android 开发环境搭建
- Linux slab 分配器剖析
- 在virtualBox中打开vdi
- 联通SGIP1.2短信接口 Java版实现 总结 2013-10-23测试通过
- Opencv几个经典的入门级程序
- hdu——1032——The 3n + 1 problem
- C语言调用Lua函数
- OCP-1Z0-052-V8.02-113题
- TYVJ 1434 黑匣子
- 据说是G开头公司的面试题【输入a1,a2,...,an,b1,b2,...,bn】
- IrrLicht入门基础
- 关于Socket通讯时通讯协议的制定
- 【数据结构与算法】二叉树递归与非递归遍历(附完整源码)