OpenCV学习--环境配置,隐藏控制台,代码示例


因为项目需要,刚开始接触OpenCV,所以大部分知识来源都是参考网上,尤其是参考了CSDN,所以借此感谢CSDN,感谢那些博主大牛们。


一、OpenCV环境配置

OpenCV环境配置

http://www.cnblogs.com/freedomshe/archive/2012/04/25/2470540.html

Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)

http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html

 

参考配置攻略自己配置了一下电脑的OpenCV环境,但是运行例子的时候总是出错。

配置后测试例子出现的错误:fatal error LNK1104: 无法打开文件“opencv_calib3d240.lib

这个错误是是个低级错误,是由于.lib前的240引起的,因为我安装的是2.4.10版本的,所以应该是2410..lib

每次新建项目后都要配置VC++目录的包含目录,库目录,及在链接->输入的附加依赖项针对debug配置添加以下库:

opencv_calib3d2410d.lib

opencv_contrib2410d.lib

opencv_core2410d.lib

opencv_features2d2410d.lib

opencv_flann2410d.lib

opencv_gpu2410d.lib

opencv_highgui2410d.lib

opencv_imgproc2410d.lib

opencv_legacy2410d.lib

opencv_ml2410d.lib

opencv_objdetect2410d.lib

opencv_ts2410d.lib

opencv_video2410d.lib

 

二、隐藏Console控制台

参考来源:http://blog.csdn.net/chenyusiyuan/article/details/4618962

VC++中使用OpenCV,一般是建立一个 win32 console application 项目,当运行此类程序的时候,默认情况下会有一个类似DOS窗口的console窗口,供程序与用户之间交互之用。

有时候我们只想在程序中运行一段功能代码,不希望显示这个 console 窗口,而是让代码执行完毕之后程序自动退出。隐藏这种 win32 console application 的 console 窗口,主要有两种方式:

1、通过#pragma指令来修改,即在main函数前添加以下一行代码: 

        #pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" )

2、通过设置项目属性来修改,即在 Project –> Properties -> Configuration Properties –> Linker -> System 的 Subsystem 项中,将 Console (/SUBSYSTEM:CONSOLE) 修改为 Console (/SUBSYSTEM:WINDOWS) ,这样就把控制台程序窗口隐去了。

上述方法是通过设置编译器的链接开关来实现的,所以让我们来看一下编译器的链接开关选项(也就是 linker 选项)

其中,linker 的 /subsystem 选项:

该选项的语法形式如下: 
  
        /SUBSYSTEM:{CONSOLE | EFI_APPLICATION | EFI_BOOT_SERVICE_DRIVER | 
        EFI_ROM | EFI_RUNTIME_DRIVER | NATIVE | POSIX | WINDOWS | WINDOWSCE} 
        [,major[.minor]] 

这个链接选项告诉操作系统如何运行可执行文件。

—— CONSOLE 
win32 字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS窗口的控制台窗口。如果在应用程序的主函数为 main() 或者 wmain(),在默认情况下该应用程序就是一个控制台应用程序。

—— Extensible Firmware Interface EFI_***): 
4种 EFI_*** 是和CPU具体架构相关的参数选项,并不常用,有兴趣的可以访问 intel 主页来查看相关内容。

—— NATIVE 
设备驱动器选项,如果 /DRIVER:WDM 选项被设定的话,该链接选项(NATIVE)就为默认选项。

—— POSIX 
windows NT 种运行在POSIX子系统上的应用程序。

—— WINDOWS 
该类型的应用程序不产生console窗口,程序窗口由用户自己创建,简而言之就是一个标准的 Win32 application,其入口地址为 WinMain()函数或者 wWinMain()函数的地址。如果你在应用程序中定义的主函数为 WinMain 或者 wWinMain,在默认情况下该应用程序就是一个Win32 Application 

—— WINDOWSCE 
运行在 windows CE 上的应用程序。

—— major and minor (optional): 
主版本号和次版本号,该选项为可选,该选项为0~65535之间的十进制整数。 

从上面可以看出,如果我们建立一个 win32 console application 的话,linker 的 /subsystem 选项应该为CONSOLE,可以在 VC6 开发环境的 project->setting->link->project option 或者 VS2005/2008 开发环境的 Project –> Properties -> Configuration Properties –> Linker -> System 中看到!

 

三、一些程示例

1、显示一张图片

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main()
{
    Mat img = imread("pp.jpg");
    if(img.empty())
    {
        cout<<"error";
        return -1;
    }
    imshow("pp的靓照",img);
    waitKey();
    return 0;
}

2、逐帧读取一个视频

#include <opencv2\opencv.hpp>
#include"highgui.h"  
#include<stdio.h>
#include <string>
using namespace cv;

void capture_frame(){

    char FileName[80];
    memset(FileName,0,sizeof FileName); 
    CvCapture* capture = cvCaptureFromAVI("H:\\test\\syh3.3gp");
    IplImage* img = 0; 
    int i;
    i = 0;
    while(cvGrabFrame(capture)){
        img=cvRetrieveFrame(capture);           // retrieve the captured frame
        sprintf(FileName,"H:\\test\\%04d.jpg",i);
        cvSaveImage(FileName,img);    
        i++;
    }
    cvReleaseCapture(&capture);
}

void main(){
	capture_frame();
	waitKey();
}

3、 视频文件的读取与基本处理。依照《Learning OpenCV》一书的例程修改实现的,其功能是读取2个视频文件,分别在两个窗口中播放,每个窗口都加入一个进度条,可以自行用鼠标控制播放进度。

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

#include "stdafx.h"
#include <iostream>
#include <cv.h>
//#include <cvaux.h>
#include <cxcore.h>
#include <highgui.h>

// 使用标准命名空间
using namespace std;

// 初始化进度条的位置
int g_slider_position1 = 0;
int g_slider_position2 = 0;

CvCapture* g_capture1 = NULL;
CvCapture* g_capture2 = NULL;

// 定义回调函数用于播放进度的控制 
void onTrackbarSlide1( int pos1 )
{
 cvSetCaptureProperty( g_capture1, CV_CAP_PROP_POS_FRAMES, pos1 );
}
void onTrackbarSlide2( int pos2 )
{
 cvSetCaptureProperty( g_capture2, CV_CAP_PROP_POS_FRAMES, pos2 );
}


int main(int argc, char** argv )
{
 // 建立播放窗口
 cvNamedWindow( "Video Test 1", CV_WINDOW_AUTOSIZE );
 cvNamedWindow( "Video Test 2", CV_WINDOW_AUTOSIZE );

 // 捕捉视频文件
 g_capture1 = cvCreateFileCapture( argv[1] );
 g_capture2 = cvCreateFileCapture( argv[2] );

 // 读取、显示视频文件的帧数
 int frames1 = (int) cvGetCaptureProperty( g_capture1, CV_CAP_PROP_FRAME_COUNT );
 cout << "frames1 = " << frames1 << endl;
 // 建立进度条
 if( frames1 != 0 )
  cvCreateTrackbar( 
   "Position", 
   "Video Test 1", 
   &g_slider_position1, 
   frames1, 
   onTrackbarSlide1
  );

 int frames2 = (int) cvGetCaptureProperty( g_capture2, CV_CAP_PROP_FRAME_COUNT );
 cout << "frames2 = " << frames2 << endl;
 if( frames2 != 0 )
  cvCreateTrackbar( 
   "Position", 
   "Video Test 2", 
   &g_slider_position2, 
   frames2, 
   onTrackbarSlide2 
  );

// 读取视频文件信息
 double fps1 = (int) cvGetCaptureProperty( g_capture1, CV_CAP_PROP_FPS );
 double fps2 = (int) cvGetCaptureProperty( g_capture2, CV_CAP_PROP_FPS );
 CvSize size1 = cvSize( 
  (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_WIDTH),
  (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_HEIGHT));
 CvSize size2 = cvSize( 
  (int)cvGetCaptureProperty(g_capture2, CV_CAP_PROP_FRAME_WIDTH),
  (int)cvGetCaptureProperty(g_capture2, CV_CAP_PROP_FRAME_HEIGHT));

// 创建 VideoWriter 
 CvVideoWriter* wrVideo1 = cvCreateVideoWriter(argv[3], CV_FOURCC('M','J','P','G'), fps1, size1);
 CvVideoWriter* wrVideo2 = cvCreateVideoWriter(argv[4], CV_FOURCC('M','J','P','G'), fps2, size2);

 int frs = 0;

 // 开始播放并保存视频
 IplImage* frame1;
 IplImage* frame2;
 
 while( frs < frames1 && frs < frames2 )
 {

  // 获取、显示源文件的帧画面
  frame1 = cvQueryFrame( g_capture1 );
  if( !frame1 ) break;
  cvShowImage( "Video Test 1", frame1 );

  frame2 = cvQueryFrame( g_capture2 );
  if( !frame2 ) break;
  cvShowImage( "Video Test 2", frame2 );

  // 保存:将当前帧写入到目标视频文件

  cvWriteFrame( wrVideo1, frame1 );
  cvWriteFrame( wrVideo2, frame2 );
  
  // 若按下 ESC 键,则退出程序
  char c = cvWaitKey(33);
  if( c==27 ) break;
 }
 // 释放内存,关闭窗口
 cvReleaseCapture( &g_capture1 );
 cvReleaseCapture( &g_capture2 );
 cvReleaseVideoWriter( &wrVideo1 );
 cvReleaseVideoWriter( &wrVideo2 );
 cvDestroyWindow( "Video Test 1" );
 cvDestroyWindow( "Video Test 2" );

 return 0;
}
感谢博主晨宇思远, http://blog.csdn.net/chenyusiyuan/article/details/4640827

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值