OpenCV2 && Qt4 chapter1:Playing with images

1. OpenCV2 几个主要模块


2. loading,display,saving image.

效果图:

头文件:  cv::Mat image; private型的。

cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QImage>
#include <QPixmap>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);

    ui->btn2->setEnabled(false);
    ui->btn3->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btn1_clicked()
{
    // the path can not in chinese
    QString fileName = QFileDialog::getOpenFileName(this,"Open_image_caption","/root/Desktop/photos"
                                                    ,"image file(*.bmp *.jpg *.jpeg *.png)");
    QMessageBox::information(this,"title",fileName.toAscii().data());
    image = cv::imread( fileName.toAscii().data());
    if( !image.data )
    {
         QMessageBox::information(this,"title","failed in imread...returned..");
         return ;
    }
    cv::namedWindow("wzy_window");
    cv::imshow("wzy_window",image);
    ui->btn2->setEnabled(true);
    ui->btn3->setEnabled(true);

    //display in label.. QImage->QPixmax->QLabel
    QImage img((uchar *)image.data,image.cols,image.rows,QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));
    ui->label->resize(ui->label->pixmap()->size());


    return ;

}

void MainWindow::on_btn2_clicked()
{

    // transformation the image.
    cv::flip(image,image,-1);// positive for horizontal
                                         // 0 for vertical,
                                  // negative for both
    cv::namedWindow("output_window");
    cv::imshow("output_window",image);

    QImage img((uchar *)image.data,image.cols,image.rows,QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));
    ui->label->resize(ui->label->pixmap()->size());
}

void MainWindow::on_btn3_clicked()
{
    cv::imwrite("/tmp/output.bmp",image);
}


OpenCV2 总结:

1.学会经常切换到头文件或实现文件去看一些声明和定义。

cv 命名空间  cv::Mat 一个矩形的数据结构 

2. cv::Mat 图像 读取,显示,保存

cv::imread()  传的参数是string型的,QString型不行。 QString -> string   qstr.toAscii().data    (中文处理见下面。)

image=cv::imread("img.jpg");
if (!image.data) {
// no image has been created…
}       image.data 是个uchar*的指针。。It is simply set to 0 when no image has been read.

读取: cv::imread()

显示: cv::namedWindow() cv::imshow()

保存:cv::imwrite()      // 这个经常出错,以后做好判断或者异常处理

3. cv::flip 函数。   对图像进行简单的转换。

cv::flip(image,result,-1);// positive for horizontal    0 for vertical           negative for both

4. 浅复制 与 深复制。cv::Mat对象。

cv::Mat image2, image3;
image2= result; // the two images refer to the same data   浅复制
result.copyTo(image3); // a new copy is created   深复制


image2,result的地址值一样, 只有当此地址上所有对象都销毁时,这个空间才会被销毁。

类中不应该返 cv::Mat对象。因为返回的是地址,而不是值。。

class T
{
private:
cv::Mat ima;
public:
cv::Mat method() { return ima; }                                 //not good.
};



Qt总结:

1.打开一个文件对话框。

QFileDialog::getOpenFileName(this,"Open_image_caption","/root/Desktop/photos"
                                                    ,"image file(*.bmp *.jpg *.jpeg *.png)");   

2. 弹出一个消息框。

QMessageBox::information(this,"title",fileName.toAscii().data());

3. QLabe 可以显示 QPixmap, QPixmap可以由 QImage构造, QImage可以由 cv::Mat构造。

QImage img((uchar *)image.data,image.cols,image.rows,QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));
    ui->label->resize(ui->label->pixmap()->size());


4. 中文路径的问题。(转)

http://blog.sina.com.cn/s/blog_6923201d0100zrjp.html

1. QT中文路径乱码问题
QT中的string使用的是QString类,C++中字符串为string或者char*,在使用OpenCV的imread读取QFileDialog打开的文件目录时,如果文件路径含有中文编码,使用imread读取图片的时候,会出现异常。我使用一下方法顺利的解决了这一问题:

void Test::on_bt_openImage_clicked()
{
      QTextCodec* codec=QTextCodec::codecForName("GB2312");
    QTextCodec::setCodecForCStrings(codec);
     QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(codec);
      QString fileName =QFileDialog::getOpenFileName(this,
             tr("Open Image"),".",
             tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
      if(!fileName.isEmpty())
      {
             image=cv::imread( fileName.toAscii().data());
             cv::namedWindow("OriginalImage");
             cv::imshow("OriginalImage", image);
      }
}

2.在 发布程序的时候,在一台没有配置任何编译环境的“裸机”上运行发布后的程序时,虽然在中文字符串前面加了tr,但是中文还是会变成乱码,一种比较简单可行的解决方案就是,在main.cpp文件中加入下面这部分代码
     QTextCodec* codec=QTextCodec::codecForName("System");
     QTextCodec::setCodecForCStrings(codec);
     QTextCodec::setCodecForTr(codec);
     QTextCodec::setCodecForLocale(codec);
在发布程序的
说明:其实问题1,中的 " GB2312 "  同样可以用 " System " 代替

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值