关闭

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题

1786人阅读 评论(0) 收藏 举报
分类:

问题描述:

这个实际上是最后一部的问题,将生成的共享库文件放入到了/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


证明移植成功!

1
0
查看评论

Linux 下编译安装OpenCV

转载http://emouse.cnblogs.com/ 按照网友的这篇博客,配好了opencv,十分感谢 Cmake的安装 OpenCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake。 ubuntu下安装cmake比较简单, ...
  • u011783201
  • u011783201
  • 2016-08-01 16:06
  • 1045

有关opencv2.3.0编译后运行的问题

今天编译opencv2.3.0写的一个文件,发现编译的时候编译器无错误编译通过但是却在运行的时候出现了如下的错误 OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with W...
  • bush2582
  • bush2582
  • 2014-03-02 00:59
  • 784

OpenCV Error: Unspecified error (The function is not implemented...

初始安装好opencv2.4.1后测试时出现以下问题:(下面第一行为测试语句,系统为Ubuntu12.04) ----想不通的是明明已经安装了GTK+2.x这些东东 ~$./DisplayImage lena.jpg OpenCV Error: Unspecified error (T...
  • loveaborn
  • loveaborn
  • 2012-06-09 11:15
  • 17038

OpenCV Error: Unspecified error (The function is not implemented...

初始安装好opencv2.4.1后测试时出现以下问题:(下面第一行为测试语句,系统为Ubuntu12.04) ----想不通的是明明已经安装了GTK+2.x这些东东 ~$./DisplayImage lena.jpg OpenCV Error: Unspecified er...
  • alec1987
  • alec1987
  • 2013-07-25 13:44
  • 3756

双目视觉嵌入式移植中Opencv程序移植时问题及解决,移植成功啦,哈哈

#include   #include   #include                 int main(int argc,char **argv) ...
  • b5w2p0
  • b5w2p0
  • 2014-08-18 10:19
  • 2185

OpenCV 人脸识别 用cvLoad()加载分类器报错的解决方法

报错情况:OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead。我发现 “\opencv\sources\data”有两个文件夹 “haarcasca...
  • qq_23827747
  • qq_23827747
  • 2016-12-12 11:17
  • 1474

opencv3 + cuda opencv error: the function/feature is not implemented

我在调用 cuda::createMorphologyFilter 时遇到了 function is not implemented 错误 在 opencv answer 上面找到答案,是因为这个函数的第三个参数必须是 Mat 而不是 GpuMat, 如果传入GpuMat, 会...
  • breakble
  • breakble
  • 2017-08-12 15:23
  • 310

OpenCV Error: The function/feature is not implemented (OpenCV was built without SURF support) in cvE

OpenCV Error: The function/feature is not implemented (OpenCV was built without SURF support) in cvExtractSURF, file /tmp/buildd/ros-hydro-opencv2-2.4...
  • dxuehui
  • dxuehui
  • 2015-05-19 10:06
  • 1967

cvNamedWindow函数使用说明

cvcvvNamedWindow cvNamedWindow 创建窗口 int cvNamedWindow( const char* name, int flags ); name窗口的名字,它被用来区分不同的窗口,并被显示为窗口标题。flags窗口属性标志。目前唯一支持的标志...
  • wanglp094
  • wanglp094
  • 2012-06-15 14:01
  • 15716

opencv cvNamedWindow cvWaitKey()

cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE) 是一个高层调用函数,有HighGUI库提供 cvNamedWindow()函数的第二个参数定义了函数的属性。该参数可被设置为o(默认值)或CV_WINDOW_AUTOSIZE 设置...
  • u012005313
  • u012005313
  • 2015-06-16 16:56
  • 2406
    个人资料
    • 访问:1914082次
    • 积分:22362
    • 等级:
    • 排名:第387名
    • 原创:271篇
    • 转载:947篇
    • 译文:3篇
    • 评论:192条
    博客专栏
    最新评论