Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行

       nsight eclipse edition是个强大的软件,可进行直接编译,也可进行交叉编译,因为我用的是jetson TX2,主要讲一下如何用它进行交叉编译。这个东西实在太方便了,创建好工程后直接远程进行编译,不用在TX2上写makefile,CMAKE文件就可以运行程序,当然了makefile和cmake写一次今后都能用,但是没有界面,用起来没有想用VS那种感觉。

     关于nsight的混合交叉编译,网上并没有相关介绍,要么是nsight的cuda交叉编译,要么是opencv的直接编译,本人尝试opencv+cuda的交叉编译,多次失败,在官方论坛发帖寻问,未得到任何回复,问了一下多位达人,也不是十分清楚,只能靠着自己一点一点摸索,功夫不负有心人,也算是运气好吧,至少得到了一个成功的办法。在这里给大家介绍一下,免得今后有像我这样的人走弯路。

     如果你初次使用nsight,我建议你先看一下这篇文章,实际操作一下,对其有个简单了解,http://blog.csdn.net/qq_38880380/article/details/76849880,这是我单方面认为的好友---小北写的文章,我很感激他能对我进行技术指导,使我感觉迈入GPU开发并没有想象中的那么难。

     言归正传,如果你按照小北的文章已经能对TX2进行CUDA编译并成功运行的话,那么可以看看我写的这个东西了,我们用到TX2往往需要进行图像处理,会经常用到opencv,那么问题来了,如何使用nsight对TX2进行opencv和CUDA混合交叉编译,然后在TX2运行呢?

     1. 确保你的主机和TX2都装有相同版本的opencv,我这里装的是opencv3.2.0

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第1张图片

     2. 在主机上打开night软件

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第2张图片

工程路径为主机上要存放的工程位置,找个自己好记的位置就行,点ok,打开nsight软件,点file->New->CUDA C/C++ Project,

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第3张图片

起个工程名,选择Empty Project,点Next

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第4张图片


这里默认为2.0,同时我勾选了6.0,影响意义不大,点Next,

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第5张图片

取消Local System,因为我们要在TX2上运行,点那个红叉后,点Manage...

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第6张图片

点击Add后,输入你TX2的IP地址和用户名,点Finish,

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第7张图片

会显示如下界面,说明远程TX2连接成功,中间可能会弹出界面让你输入TX2用户密码,敲上即可。

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第8张图片

这里Project Path为TX2上要保存的工程路径(不是主机上),设置好,Toolkit那里有可能是空的,点右边的Manage...

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第9张图片

点Detect...,软件会自动搜索TX2上的Toolkit Path,搜索到后点击Finish,回到刚才界面,CPU Architecture那里选择AArch64,再次确认一下Toolkit和CPU Architecture没有错误后,点Finish,完成工程项目的创建。

    3. 在界面左侧右键点test,选择New->Folder,起名src,用于存放工程代码,点Finish。

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第10张图片

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第11张图片

右键点击src, New->File, 先创建一个文件用opencv读取图像,起名test.cpp(注意后缀名.cpp不要忘记写),点Finish,编写代码,如下图

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第12张图片

这里我贴一下代码吧,免得大家手敲麻烦:

#include
#include
using namespace cv;
extern "C" int test(void);
int main(int argc, char** argv )
{
if ( argc != 2 )
{
printf("usage: DisplayImage.out \n");
return -1;
}
Mat image;
image = imread( argv[1], 1 );
test();
if ( !image.data )
{
printf("No image data \n");
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);
return 0;
}

同样,再次右键点击src, New->File, 先创建一个cuda文件,起名hello.cu(注意后缀名.cu不要忘记写),点Finish,编写代码,如下图

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第13张图片

代码如下:

#include


__global__ void helloFromGPU(void)
{
printf("Hello World form GPU!\n");
}


extern "C" int test(void)
{
printf("Hello World form CPU!\n");


helloFromGPU<<<1, 2>>>();
cudaDeviceReset();
//cudaDeviceSynchronize();
return 0;
}

编译一下,ctrl+B,报错(废话,当然会错),至此工程代码编写完成。

     4. 重点来了,配置opencv库,点软件上面的Project->Properties

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第14张图片

点左侧Build旁边的三角,下拉出菜单后点Settings,然后右侧点Tool Settings,在下面点击Includes,然后在include paths(-I)那里点击绿色小加号

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第15张图片

这里要输入主机opencv的目录,如果不知道目录在哪,在终端输入

pkg-config --cflags opencv

查询,按照查询结果填上去,这里不用把终端查询到的前缀-I填进去,复制后面的就行,(在设置opencv的

include路径时,我们看到终端查询到两个地址,但是我亲自查看了一下文件夹,发现-I/usr/local/include

下并没有任何相关文件,可不引入,只保留/usr/local/include/opencv即可

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第16张图片

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第17张图片


点击NVCC Linker下的Libraries,在Libraries(-l)那里添加opencv库,在终端输入

pkg-config --libs opencv

进行查询,将查到的库一个一个输进去,一次只能输一个,别偷懒,同样-l前缀不用填

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第18张图片

填写完成后,是这样的

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第19张图片

再在下面的Library search path(-L)那里添加刚才终端查询到的库地址

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第20张图片

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第21张图片

点OK,配置完成。回到工程界面,重新编译ctl+B, 编译完成,

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第22张图片

没有提示报错,说明编译成功了,这时候我们发现TX2工程目录里多了两个文件夹

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第23张图片

进入Debug文件夹,把测试图片扔进去,随便找一张图片,在TX2终端运行,

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第24张图片

可以看到程序运行成功~~哈哈哈~~和预期一样,test.cpp用opencv读入图像,hello.cu用cuda打出的hello world。

Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行_第25张图片



你可能感兴趣的:(Nsight Eclipse的opencv+cuda的交叉编译,在TX2已验证可行)