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