【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权限。
最终就成功啦,把程序拷到开发板上运行就可啦。
运行错误:
123456OpenCV Error: 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
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
原始图片:

处理后图像:

证明移植成功!
【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题的更多相关文章
- OpenCV在ARM-linux上的移植过程遇到的问题3---共享库中嵌套库居然带路径【未解决】
[Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题3-共享库中嵌套库居然带路径[未解决] 标签(空格分隔): [Linux开发] 移植opencv到tq2440 一.下载open ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】
[Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题4-共享库中嵌套库带路径[已解决] 标签:[Linux开发] 紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交 ...
- 【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID
[Linux开发]如何查看Linux kernel的内置模块驱动列表和进程ID 标签:[Linux开发] 命令: cat /lib/modules/$(uname -r)/modules.builti ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题
实际上这里说的是移植的第一步,下载到源码后,我用的是opencv2.4.9,解压缩,然后可以利用cmake-gui来进行configure配置,这里面需要设置交叉编译的工具链,具体的可以参考[Linu ...
- 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发
针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...
- Linux 安装 go 以及 arm linux 移植 go
背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...
- opencv在arm和x86在移植
一个.开发环境 操作系统:fedora14 Opencv版本号:2.0 Qt版本号:4.7 arm:mini6410 交叉编译工具:arm-linux-gcc-4.5.1 二.安装与配置 Linux系 ...
- 【laravel5.4】git上clone项目到本地,配置和运行 项目报错:../vendor/aotuload.php不存在
1.一般我们直接使用git clone 将git的项目克隆下来,在本地git库和云上git库建立关联关系 2.vendor[扩展]文件夹是不会上传的,那么下载下来直接运行项目,会报错: D:phpSt ...
- Linux开发工具之Makefile(上)
二.makefile(上) 01.make工具 利用make工具可以自动完成编译工作.这些工作包括:如果修改了某几 个源文件,则只重装新编译这几个源文件:如果某个头文件被修改了,则 重新编译所有包 ...
随机推荐
- JQuery 处理 微擎传递过去数据
JQuery 处理 微擎传递过去数据 PS:微擎得到的数据大多数是数组(我们这里处理数组) 将数组使用 json_encode() 函数处理成 JSON 格式 前端在 script 中使用 引号 将变 ...
- Java并发编程实战 第16章 Java内存模型
什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...
- Maven私服仓库
Maven私服仓库 现象:在maven install的时候,会做以下事情 [INFO] Installing /Users/cqq/Documents/VanDreamPro/vandream-er ...
- bash: ipconfig: command not found
问题描述: [root@localhost ~]# ipconfig-bash: ipconfig: command not found[root@localhost ~]# 解决方法一: cd /e ...
- spark2.1.0 自定义AccumulatorV2累加少值(线程不安全)?
一.踩坑经历 自定义的accumulator是线程不安全的,会造成累加结果不正确.自定找了很久没想到是线程不安全行成的. 二.解决方法 创建一个线程安全的集合变量(我用的是Java的Concurren ...
- Q15格式表示负小数
1.用Q15.16-bit格式,表示出-0.5? 解析:其实很简单,Q15是dsp里为了优化浮点的,就是将小数* 2^15. 例如:0.333 * 32768 = 10911.744 取整数就是10 ...
- SQLite为何要用C语言来开发?
SQLite 选择 C 语言的理由是?为什么不选择 Go 或者 Rust? C 语言是最好的 SQLite 在 2000 年 5 月 29 日发布,并一直使用 C 语言实现.C 语言一直是实现 SQL ...
- 使用webuploader组件实现大文件分片上传,断点续传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- FJWC2017&FJOI2017一试 游记
day1 早上是以前泉州七中的杨国烨讲课.(据说当时看新闻说是一对双胞胎一起上thu的其中一个)课题是图论/网络流. 下午第一道一开始推出来了一个之和面积有关的式子,然后觉得可以容斥一发,觉得 ...
- jQuery_完成表格的隔行换色
表格的颜色一样不利于区分,而利用jQuery则可以很方便的进行表格的隔行换色操作,原表如下: 这样看着很不方便,但是隔行换色之后非常便捷清楚. 代码如下: <!DOCTYPE html> ...