OpenCV 3.2.0+Visual Studio 2015 配置

前言

自从用OpenCV 1.0 做过数据结构的课设以后就感受到了OpenCV的强大,也一直想用VS配置一下OpenCV的最新版本然后学习一下,但是苦于前段时间一直没有什么时间外加本人是懒人一个,所以一直拖到现在才搞定。总体来说,配置OpenCV大约需要以下步骤:

  1. 下载OpenCV并安装
  2. 配置环境变量(PATH变量)
  3. 在Visual Studio中新建工程并配置include目录、lib目录以及需要链接的lib
  4. 从该工程新建模板,并加入到 Visual Studio 中。
  5. 修改模板,使之生成正确的文件
  6. 测试、验证。

1.下载OpenCV并安装

关于OpenCV的下载,建议去OpenCV官网下载,如果是校园网有IPV6的话速度还可以。我下载的是目前的最新版本,地址是:

https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.2.0/opencv-3.2.0-vc14.exe/download

安装过程就是解压下载到的文件到一个指定目录即可,可以双击exe文件打开然后解压也可以直接用7zip对这个exe文件解压。

2.配置环境变量

配置环境变量,右击计算机,选择属性,然后单击左边的高级系统设置,选择环境变量,然后选择PATH项,单击编辑,然后单击添加,添加如下两条记录:
${opencv path}/build/bin
${opencv path}/build/x64/vc14/bin

注意:替换${opencv path} 为你安装opencv的目录,后面同理

3. 在Visual Studio中新建工程并配置include目录、lib目录以及需要链接的lib

打开VS,然后选择新建项目,选择 visual C++ ,然后选择Win32控制台应用程序,取一个你自己顺口的名字,然后单击确定。
完成新建工程后,选择项目,然后选择${your project name}属性,在配置里选择所有配置,在平台里选择所有平台,然后选择VC++目录,在包含目录里填上:
${opencv path}/build/include
${opencv path}/build/include/opencv2
${opencv path}/build/include/opencv
这三项记录,然后在库目录里填写:
${opencv path}/build/x64/vc14/lib

填写完成后点确定,然后重新打开属性,在配置里选择Debug,平台选择x64,然后在链接器->输入->附加依赖项里填写opencv_world320d.lib
保存后选择Release在链接器->输入->附加依赖项里填写opencv_world320.lib.配置完成

4.从该工程新建模板,并加入到 Visual Studio 中。

保存工程,然后选择文件->导出模板,在弹出的窗口中选择项目模板,然后下一步,起一个自己喜欢的名字,选一张自己喜欢的图片作为缩略图,然后点击完成。然后资源管理器会打开,你能看到你新建的模板的名称的一个压缩包。模板创建完成

5.修改模板,使之生成正确的文件

解压刚才你看到的那个压缩文件,然后用你喜欢的编辑器打开MyTemplate.vstemplate文件,这就是一个xml文件,然后在TemplateContent这一段中添加你的文件名字,并把最开始你建立的工程中的所有的.cpp .h文件拷贝到你的这个模板的根目录下,具体情况可以参考microsoft的这个帮助界面(格式非常简单,即使你不懂xml也可以望文生义来改2333)

如何:创建项目模板 https://msdn.microsoft.com/zh-cn/library/xkh1wxd8.aspx

这里提供一个示例:


<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData>
    <Name>OpenCV3.2.0_x64</Name>
    <Description>OpenCV 3.2.0的默认配置</Description>
    <ProjectType>VC</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>
    <DefaultName>OpenCV3.2.0_x64</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>__TemplateIcon.png</Icon>
    <PreviewImage>__PreviewImage.png</PreviewImage>
  </TemplateData>
  <TemplateContent>
    <Project TargetFileName="OpenCV3.2.0.vcxproj" File="OpenCV3.2.0.vcxproj" ReplaceParameters="true">
      <ProjectItem ReplaceParameters="false" TargetFileName="$projectname$.vcxproj.filters">OpenCV3.2.0.vcxproj.filters</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="ReadMe.txt">ReadMe.txt</ProjectItem>
      <ProjectItem ReplaceParameters="false" TargetFileName="$projectname$.cpp">main.cpp</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="stdafx.cpp">stdafx.cpp</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="stdafx.h">stdafx.h</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="targetver.h">targetver.h</ProjectItem>
	  //修改这里(不确定加上这句注释可不可以,但是建议你在拷贝的时候删掉)上面的几个文件分别对应你从你的项目里拷贝过来的文件
    </Project>
  </TemplateContent>
</VSTemplate>

然后把你拷贝过来的文件里搜索${your project name},然后替换成$projectname$,这样在用模板新建工程的时候就可以直接替换了而不是你原来的那个名字。(详细情况请查阅MSDN上的帮助资源)

然后重新压缩你修改后的模板的文件(注意使用zip格式),然后删除原来的zip文件(或者备份一下),并将其拷贝到\文档\Visual Studio 2015\Templates\ProjectTemplates目录下替换掉原来的zip文件(注意不同的电脑可能不一样,如果你的这里没有那个zip文件请自行寻找,如果没单独设置过的话应该就是这里)。

6.测试、验证。

关闭VS,然后重新打开,选择新建项目,在VisualC++一栏里你应该能看到自己刚才新建的那个模板,然后选择这个模板,创建一个工程。然后在右侧的资源管理器中打开你的cpp文件,复制一下opencv目录下提供的示例代码中的分水岭算法(注意保留stdafx.cpp文件),改一下图片文件的路径,然后编译一下,如果可以编译通过并成功运行的话就是配置成功了。

以后每一次使用opencv的时候直接从你创建的模板里新建工程即可,不用每一次都要进行繁琐的配置,简单方便23333

ps:如果运行时出现缺失 *.dll 文件请检查环境变量配置是否有问题,如果没问题的话打开任务管理器重启资源管理器或者直接重启计算机应该都可以解决问题。

psps:写的匆忙,难免有些疏漏,如果遇到问题或者发现我有什么写的疏漏的地方,可以给我发邮件,或者在下面评论

pspsps:如果你实在是懒的找OpenCV的示例代码,这里给你贴一下233333

watershed.cpp:


#include "stdafx.h"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <cstdio>
#include <iostream>
using namespace cv;
using namespace std;
static void help()
{
cout << "\nThis program demonstrates the famous watershed segmentation algorithm in OpenCV: watershed()\n"
"Usage:\n"
"./watershed [image_name -- default is ../data/fruits.jpg]\n" << endl;
cout << "Hot keys: \n"
"\tESC - quit the program\n"
"\tr - restore the original image\n"
"\tw or SPACE - run watershed segmentation algorithm\n"
"\t\t(before running it, *roughly* mark the areas to segment on the image)\n"
"\t  (before that, roughly outline several markers on the image)\n";
}
Mat markerMask, img;
Point prevPt(-1, -1);
static void onMouse( int event, int x, int y, int flags, void* )
{
if( x < 0 || x >= img.cols || y < 0 || y >= img.rows )
return;
if( event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON) )
prevPt = Point(-1,-1);
else if( event == EVENT_LBUTTONDOWN )
prevPt = Point(x,y);
else if( event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON) )
{
Point pt(x, y);
if( prevPt.x < 0 )
prevPt = pt;
line( markerMask, prevPt, pt, Scalar::all(255), 5, 8, 0 );
line( img, prevPt, pt, Scalar::all(255), 5, 8, 0 );
prevPt = pt;
imshow("image", img);
}
}
int main( int argc, char** argv )
{
cv::CommandLineParser parser(argc, argv, "{help h | | }{ @input | ../data/fruits.jpg | }");
if (parser.has("help"))
{
help();
return 0;
}
string filename = parser.get<string>("@input");
Mat img0 = imread(filename, 1), imgGray;
if( img0.empty() )
{
cout << "Couldn'g open image " << filename << ". Usage: watershed <image_name>\n";
return 0;
}
help();
namedWindow( "image", 1 );
img0.copyTo(img);
cvtColor(img, markerMask, COLOR_BGR2GRAY);
cvtColor(markerMask, imgGray, COLOR_GRAY2BGR);
markerMask = Scalar::all(0);
imshow( "image", img );
setMouseCallback( "image", onMouse, 0 );
for(;;)
{
char c = (char)waitKey(0);
if( c == 27 )
break;
if( c == 'r' )
{
markerMask = Scalar::all(0);
img0.copyTo(img);
imshow( "image", img );
}
if( c == 'w' || c == ' ' )
{
int i, j, compCount = 0;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(markerMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
if( contours.empty() )
continue;
Mat markers(markerMask.size(), CV_32S);
markers = Scalar::all(0);
int idx = 0;
for( ; idx >= 0; idx = hierarchy[idx][0], compCount++ )
drawContours(markers, contours, idx, Scalar::all(compCount+1), -1, 8, hierarchy, INT_MAX);
if( compCount == 0 )
continue;
vector<Vec3b> colorTab;
for( i = 0; i < compCount; i++ )
{
int b = theRNG().uniform(0, 255);
int g = theRNG().uniform(0, 255);
int r = theRNG().uniform(0, 255);
colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
}
double t = (double)getTickCount();
watershed( img0, markers );
t = (double)getTickCount() - t;
printf( "execution time = %gms\n", t*1000./getTickFrequency() );
Mat wshed(markers.size(), CV_8UC3);
// paint the watershed image
for( i = 0; i < markers.rows; i++ )
for( j = 0; j < markers.cols; j++ )
{
int index = markers.at<int>(i,j);
if( index == -1 )
wshed.at<Vec3b>(i,j) = Vec3b(255,255,255);
else if( index <= 0 || index > compCount )
wshed.at<Vec3b>(i,j) = Vec3b(0,0,0);
else
wshed.at<Vec3b>(i,j) = colorTab[index - 1];
}
wshed = wshed*0.5 + imgGray*0.5;
imshow( "watershed transform", wshed );
}
}
return 0;
}


评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注