【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跑成功的代码如下:


[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <QApplication>  
  2. #include <QLabel>  
  3. #include <QPushButton>  
  4. #include <QTimer>  
  5. #include <QUdpSocket>  
  6. #include <QMainWindow>  
  7. #include <QImage>  
  8. #include <QMutex>  
  9. #include <QQueue>  
  10. #include <QThread>  
  11. #include <QWaitCondition>  
  12. #include <QDialog>  
  13. #include <QHBoxLayout>  
  14. #include <QVBoxLayout>  
  15.   
  16. #include <opencv/cv.h>  
  17. #include <opencv/highgui.h>  
  18.   
  19. #include <QFileDialog>  
  20.   
  21. using namespace cv;  
  22.   
  23. static QImage Mat2QImage(Mat& image)  
  24. {  
  25.     QImage img;  
  26.   
  27.     if (image.channels()==3) {  
  28.         cvtColor(image, image, CV_BGR2RGB);  
  29.         img = QImage((const unsigned char *)(image.data), image.cols, image.rows,  
  30.                 image.cols*image.channels(), QImage::Format_RGB888);  
  31.     } else if (image.channels()==1) {  
  32.         img = QImage((const unsigned char *)(image.data), image.cols, image.rows,  
  33.                 image.cols*image.channels(), QImage::Format_ARGB32);  
  34.     } else {  
  35.         img = QImage((const unsigned char *)(image.data), image.cols, image.rows,  
  36.                 image.cols*image.channels(), QImage::Format_RGB888);  
  37.     }  
  38.   
  39.     return img;  
  40. }  
  41.   
  42. int main(int argc, char *argv[])  
  43. {  
  44.     QApplication app(argc, argv);  
  45.   
  46.     QWidget *wn = new QWidget;  
  47.     wn->setWindowTitle("disp image");  
  48.   
  49.     QString filename = QFileDialog::getOpenFileName(0, "Open File""""*.jpg *.png *.bmp", 0);  
  50.     if (filename.isNull()) {  
  51.         return -1;  
  52.     }  
  53.   
  54.     Mat image = imread(filename.toAscii().data(), 1);  
  55.     QImage img = Mat2QImage(image);  
  56.   
  57.     QLabel *label = new QLabel("", 0);  
  58.     label->setPixmap(QPixmap::fromImage(img));  
  59.   
  60.     QPushButton *bnt = new QPushButton("Quit");  
  61.     QObject::connect(bnt, SIGNAL(clicked()), &app, SLOT(quit()));  
  62.   
  63.     QVBoxLayout *layout = new QVBoxLayout;  
  64.     layout->addWidget(label);  
  65.     layout->addWidget(bnt);  
  66.     wn->setLayout(layout);  
  67.   
  68.     wn->show();  
  69.   
  70.     return app.exec();  
  71. }  


功能是通过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

原始图片:

opencv,程序,成功,解决,移植0


处理后图像:

opencv,程序,成功,解决,移植1


证明移植成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值