• 【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

    原始图片:

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


    处理后图像:

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


    证明移植成功!

  • 相关阅读:
    安卓手机!用swiper做轮播效果,两张图片之间会有一个像素的空白
    手机端swiper快速滑动会有白屏
    axios请求下载excel文件
    人人都能学会的webpack5搭建vue3项目(二)配置Vue
    人人都能学会的webpack5搭建vue3.0项目,可应用于生产环境 (一)
    mybatis 生成 mapper文件
    超强工具类系列
    mybatis 自动生成mapper文件
    面试
    linux安装mysql8.0.25
  • 原文地址:https://www.cnblogs.com/huty/p/8518226.html
Copyright © 2020-2023  润新知