【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题
问题描述:
这个实际上是最后一部的问题,将生成的共享库文件放入到了/usr/local/opencv-arm/lib下,并且设置了LD_LIBRARY_PATH中为/usr/local/opencv-arm/lib,动态链接库的一个搜索路径。程序终于可以跑起来了,但是却输出了下面的问题:
Unspecified error (The
function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /usr/local/opencv/OpenCV-2.0.0/src/highgui/window.cpp,
line 100
很显然,这个问题就是调用了cvNamedWindow造成的,猜测是GUI的问题,本来以为是需要在宿主机上安装以上的两个库,然后重新CMAKE一下,然后就可以解决这个问题,但是我猜错了,这个说的应该是在往ARM-linux上移植这个,通过下面参考我确定的问题的所在,也不再纠结,以后就不用OpenCV去显示,而是采用OpenCV去做计算机视觉的算法处理,用Qt去显示。
具体测试OpenCV跑成功的代码如下:
#include <QApplication> #include <QLabel> #include <QPushButton> #include <QTimer> #include <QUdpSocket> #include <QMainWindow> #include <QImage> #include <QMutex> #include <QQueue> #include <QThread> #include <QWaitCondition> #include <QDialog> #include <QHBoxLayout> #include <QVBoxLayout> #include <opencv/cv.h> #include <opencv/highgui.h> #include <QFileDialog> using namespace cv; static QImage Mat2QImage(Mat& image) { QImage img; if (image.channels()==3) { cvtColor(image, image, CV_BGR2RGB); img = QImage((const unsigned char *)(image.data), image.cols, image.rows, image.cols*image.channels(), QImage::Format_RGB888); } else if (image.channels()==1) { img = QImage((const unsigned char *)(image.data), image.cols, image.rows, image.cols*image.channels(), QImage::Format_ARGB32); } else { img = QImage((const unsigned char *)(image.data), image.cols, image.rows, image.cols*image.channels(), QImage::Format_RGB888); } return img; } int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *wn = new QWidget; wn->setWindowTitle("disp image"); QString filename = QFileDialog::getOpenFileName(0, "Open File", "", "*.jpg *.png *.bmp", 0); if (filename.isNull()) { return -1; } Mat image = imread(filename.toAscii().data(), 1); QImage img = Mat2QImage(image); QLabel *label = new QLabel("", 0); label->setPixmap(QPixmap::fromImage(img)); QPushButton *bnt = new QPushButton("Quit"); QObject::connect(bnt, SIGNAL(clicked()), &app, SLOT(quit())); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(label); layout->addWidget(bnt); wn->setLayout(layout); wn->show(); return app.exec(); }
功能是通过QFileDialog选择一个文件,用OpenCV的imread去读取,然后再将Mat中的数据转移到QImage中,利用Qt的QLabel去显示。
全程运行没有报错!
--------------------------
Opencv移植方法:http://blog.csdn.net/b5w2p0/article/details/8976665
我用的是Cmake,最终成功,把路径下生成的so文件拷到开发板的 /lib文件下。
在这之前也可能要移植ffmpge:http://blog.csdn.net/b5w2p0/article/details/38455071
遇到问题多看文章,多试几次最终一定会成功。
现在就可以编译程序啦:
<span style="font-size:18px;">#include <cv.h> #include <cxcore.h> #include <highgui.h> int main(int argc,char **argv) { CvCapture* capture = NULL; IplImage* pImg = NULL; fprintf(stderr, "123"); pImg = cvLoadImage("1.jpg",1); fprintf(stderr, "456"); cvNamedWindow("video", 1); fprintf(stderr, "789"); cvShowImage("video", pImg); fprintf(stderr, "109"); cvWaitKey(-1); cvDestroyWindow("video"); cvReleaseImage( &pImg ); return 0; } </span>
编译命令:
arm-none-linux-gnueabi-g++ opencv_chuli.cpp -o opencv_testchuli -I/usr/local/opencv-arm/OpenCV/include/opencv -L/usr/local/opencv-arm/OpenCV/lib -lml -lcvaux -lhighgui -lcv -lcxcore -lpthread -lrt
注意:1、这是一个命令,是一行,当然不同指令中间要加空格。
2、opencv_chuli.cpp 是你的程序文件,把上面的程序复制到文档里再重命名成这个名字就可以了。
3、opencv_testchuli 这是最终生成的二进制文件名,可以修改,到时要拷到开发板上。
4、/usr/local/opencv-arm/OpenCV/include/opencv 这是编译成功的OpenCV路径,/usr/local/opencv-arm/OpenCV/lib也一样。
在终端运行,注意要用root权限。
最终就成功啦,把程序拷到开发板上运行就可啦。
运行错误:
terminate called after throwing an instance of 'cv::Exception'
Aborted
GTK是一种GUI库,参考:http://blog.csdn.net/b5w2p0/article/details/38644795
我以后要用QT 所以就不移植啦。
第二个程序:
<span style="font-size:14px;">#include <cv.h> #include <cxcore.h> #include <highgui.h> int main(int argc,char **argv) { CvCapture* capture = NULL; IplImage* pImg = NULL; IplImage* pImg1 = NULL; fprintf(stderr, "123"); pImg = cvLoadImage("1.jpg",1); fprintf(stderr, "456"); pImg1 = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1); fprintf(stderr, "456"); cvCvtColor(pImg,pImg1,CV_RGB2GRAY); fprintf(stderr, "789"); cvSaveImage("1_1.jpg",pImg1); fprintf(stderr, "109"); cvReleaseImage( &pImg ); cvReleaseImage( &pImg1 ); return 0; } </span>
运行问题:
123456Segmentation fault
解决:http://blog.csdn.net/b5w2p0/article/details/38656323,可能是我没有移植libjpeg的原因,改变后程序:
<span style="font-size:14px;">#include <cv.h> #include <cxcore.h> #include <highgui.h> int main(int argc,char **argv) { CvCapture* capture = NULL; IplImage* pImg = NULL; IplImage* pImg1 = NULL; fprintf(stderr, "123"); pImg = cvLoadImage("1.bmp",1); fprintf(stderr, "456"); pImg1 = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1); fprintf(stderr, "456"); cvCvtColor(pImg,pImg1,CV_RGB2GRAY); fprintf(stderr, "789"); cvSaveImage("1_1.bmp",pImg1); fprintf(stderr, "109"); cvReleaseImage( &pImg ); cvReleaseImage( &pImg1 ); return 0; } </span>
运行结果:
123456456789109
原始图片:
处理后图像:
证明移植成功!
相关文章
- [计算机视觉][ARM-Linux开发]OpenCV 3.1下载 ippicv_linux_20151201失败
- [计算机视觉][ARM-Linux开发]OpenCV 3.1下载 ippicv_linux_20151201失败
- 【Linux开发】OpenCV在ARM上的移植
- 【Linux开发】linux设备驱动归纳总结(三):4.ioctl的实现
- Linux网络编程(六)-高并发服务器03-I/O多路复用01:select(Win、Linux)【由内核监听多个“文件描述符”的读写缓冲区变化】【受限于宏FD_SETSIZE大小(1024)】
- ubuntu安装opencv:ICV: Downloading ippicv_linux_20151201.tgz...|error: #error This file requires compil
- opencv linux
- (二)Linux下的crontab定时执行任务命令详解
- Linux性能分析工具汇总合集
- Linux之gdb的使用
- Linux 光盘挂载步骤
- 即将25岁的Linux虽然伟大,却有不赚钱的困境
- Linux下安装并使用Java开发opencv的配置
- linux之sed用法
- 跟阿铭学Linux第3版
- kali linux: 网卡监听及扫描网络
- Linux 常用性能工具简介.
- Linux kill和kill-9区别
- Linux 初始化之 Systemd机制
- linux定时调度器每秒运行一次
- 使用VS2017 编写Linux系统上的Opencv程序
- Suse Linux 15 SP3 安装zabbix-agent 5.x