OpenCV常用的基础小工程

本文提供使用OpenCV进行图像及视频处理的基础示例代码,包括读取与显示图像、播放视频文件、摄像头实时视频处理等。通过这些示例帮助初学者快速上手OpenCV。

http://www.cnblogs.com/tornadomeet/archive/2012/04/23/2467153.html

本文中将列出OpenCV需常用的最小工程,以方便今后做测试用。

  工程环境为vs2010+opencv2.3.1

一、opencv读取图片并显示出来:

#include "stdafx.h"
 #include <opencv2/highgui/highgui.hpp>
 
 using namespace cv;
 
 int main(int argc,unsigned char* argv[])
 {
     Mat img_src;
     for (;;)
     {
         img_src=imread("lena.jpg");
         imshow("lena_show",img_src);
         waitKey(30);
     }
     return 0;
 }

二、opencv读取avi文件并显示出来:

  注意有些avi格式的视频是读不出来的。

#include "stdafx.h"
 #include <opencv2/highgui/highgui.hpp>
 
 using namespace cv;
 
 int main(int argc,unsigned char* argv[])
 {
     Mat img_src;
     VideoCapture vido_file("tree.avi");
     for (;;)
     {
         vido_file >>img_src;
         imshow("video_src",img_src);//可以事先不用新建一个窗口
         char c=(char)waitKey(47);
         if (c==27)
         {
             break;    
         }
     }
     return 0;
 }

三、opencv驱动摄像头并显示出来:

 #include "stdafx.h"
 #include <opencv2/highgui/highgui.hpp>
 
 using namespace cv;
 
 int main(int argc,unsigned char* argv[])
 {
     Mat img_src;
     VideoCapture cam(0);
     for (;;)
     {
         cam >>img_src;
         imshow("camera",img_src);//可以事先不用新建一个窗口
         char c=(char)waitKey(30);
         if (c==27)
         {
             break;    
         }
     }
     return 0;
 }

四、opencv打开摄像头并对摄像头内视频进行canny边缘检测。

   以下的环境改为:opencv2.4.2+vs2010

// cam_test.cpp : 定义控制台应用程序的入口点。
 //
 
 #include "stdafx.h"
 #include <opencv2/core/core.hpp>
 #include <opencv2/highgui/highgui.hpp>
 #include <opencv2/imgproc/imgproc.hpp>
 #include <iostream>
 
 #pragma comment( lib, "opencv_core242.lib" )
 #pragma comment( lib, "opencv_highgui242.lib" )
 #pragma comment( lib, "opencv_imgproc242.lib" )
 
 using namespace cv;
 using namespace std;
 
 int main( int argc, const char **argv )
 {
 
     VideoCapture cap(0); // open the default camera
     if(!cap.isOpened()) // check if we succeeded
         return -1;
     Mat edges;
     namedWindow("edges",1);
     for(;;)
     {
         Mat frame;
         cap >> frame; // get a new frame from camera
         cvtColor(frame, edges, CV_BGR2GRAY);
         GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
         Canny(edges, edges, 0, 30, 3);
         imshow("edges", edges);
         if(waitKey(30) >= 0) break;
     }
     // the camera will be deinitialized automatically in VideoCapture destructor
     return 0;
 }

五、矩阵方式 resize图像缩放代码

double scale=0.5; //设置缩放倍数
string imageurl = "F:/opencv/samples/cpp/baboon.jpg";
Mat image =imread(imageurl);Â 
//缩放 
Size dsize = Size(image.cols*scale,image.rows*scale);
Mat image2 = Mat(dsize,CV_32S);
resize(image, image2,dsize);

首先定义scale变量,图片要缩放的倍数。

然后用Mat函数创建image矩阵,并加载图像。

Size函数是设置图像框架大小

resize函数调整图片大小。


OpenCV项目 这是一个个人在使用OpenCV过程中写的一些小项目,以及一些非常有用的OpenCV代码,有些代码是对某论文中的部分实现。 注意:代码是在Xcode里写的,如果要在win下测试,遇到问题自己修改。 opencv-rootsift-py 用python和OpenCV写的一个rootsift实现,其中RootSIFT部分的代码参照Implementing RootSIFT in Python and OpenCV这篇文章所写,通过这个你可以了解Three things everyone should know to improve object retrieval这篇文章中RootSIFT是怎么实现的。 sift(asift)-match-with-ransac-cpp 用C++和OpenCV写的一个图像匹配实现,里面包含了采用1NN匹配可视化、1NN匹配后经RANSAC剔除错配点可视化、1NN/2NN<0.8匹配可视化、1NN/2NN<0.8经 RANSAC剔除错配点可视化四个过程,其中1NN/2NN<0.8匹配过程是Lowe的Raw feature match,具体可以阅读Lowe的Distinctive image features from scale-invariant keypoints这篇文章。这个对图像检索重排非常有用。另外里面还有用OpenCV写的ASIFT,这部分来源于OPENCV ASIFT C++ IMPLEMENTATION,ASIFT还可以到官网页面下载,ASIFT提取的关键点 比SIFT要多得多,速度非常慢,不推荐在对要求实时性的应用中使用。 更多详细的分析可以阅读博文SIFT(ASIFT) Matching with RANSAC。 有用链接 OpenCV3.0文档 // 测试sparse unsigned int centersNum = 10; vector descrNums; descrNums.push_back(8); descrNums.push_back(12); //unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5; 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5, 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; sp_mat Hist(descrNums.size(), centersNum); static long int count = 0; for (int i = 0; i < descrNums.size(); i++){ unsigned int* desrcElementsTmp = new unsigned int[descrNums[i]]; memcpy(desrcElementsTmp, T + count, descrNums[i] * sizeof(T[0])); //cout << desrcElementsTmp[0] << '\t' << desrcElementsTmp[1] << '\t' << desrcElementsTmp[2] << '\t' << desrcElementsTmp[3] << '\t' << desrcElementsTmp[4] << '\t' <<endl; //cout << desrcElementsTmp[5] << '\t' << desrcElementsTmp[6] << '\t' << desrcElementsTmp[7] << '\t' << desrcElementsTmp[8] << '\t' << desrcElementsTmp[9] << '\t' << desrcElementsTmp[10] << '\t' <<endl; //cout << endl; sp_mat X(1, centersNum); X.zeros(); for (int j = 0; j < descrNums[i]; j++){ X(0, desrcElementsTmp[j]-1) += 1; } X.print("X:"); X = X/norm(X, 2); Hist.row(i) = X; count = count + descrNums[i]; delete desrcElementsTmp; } //Hist.print("Hist:");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值