QT5.9和VS2019图片读取失败的解决方案

QT5.9和VS2019图片读取失败的解决方案

最近入C++/OpenCV的坑了,MATLAB找工作太难了。。MATLAB—GUI用习惯了,也就顺便学习了一下Qt.
这是简单写的一个界面,图像读取的时候出了太多问题。
在这里插入图片描述
在这里插入图片描述
头文件有这些

#pragma once

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QApplication>
#include "ui_QtGuiApplication1.h"
#include <iostream>
#include <QApplication>
#include <QFileDialog>
#include <QDebug>
#include <QString>
#include <QGraphicsEllipseItem>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>

1.opencv的图片格式和qt的图片格式转换问题
我是采用opencv读取的图片,显示需要转成Qt的QPixmap或者QImage形式
这个是 cvMat转化为QImage的函数,主要是对CV_8UC1,CV_8UC3,CV_8UC4四种格式进行转化。

QImage cvMat2QImage(const cv::Mat& mat)
{ // 8-bits unsigned, NO. OF CHANNELS = 1
	// 8-bits unsigned, NO. OF CHANNELS = 1
	if (mat.type() == CV_8UC1)
	{
		QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
		// Set the color table (used to translate colour indexes to qRgb values)
		image.setColorCount(256);
		for (int i = 0; i < 256; i++)
		{
			image.setColor(i, qRgb(i, i, i));
		}
		// Copy input Mat
		uchar* pSrc = mat.data;
		for (int row = 0; row < mat.rows; row++)
		{
			uchar* pDest = image.scanLine(row);
			memcpy(pDest, pSrc, mat.cols);
			pSrc += mat.step;
		}
		return image;
	}
	// 8-bits unsigned, NO. OF CHANNELS = 3
	else if (mat.type() == CV_8UC3)
	{
		// Copy input Mat
		const uchar* pSrc = (const uchar*)mat.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
		return image.rgbSwapped();
	}
	else if (mat.type() == CV_8UC4)
	{
		qDebug() << "CV_8UC4";
		// Copy input Mat
		const uchar* pSrc = (const uchar*)mat.data;
		// Create QImage with same dimensions as input Mat
		QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
		return image.copy();
	}
	else
	{
		qDebug() << "ERROR: Mat could not be converted to QImage.";
		return QImage();
	}
}

使用的时候,opencv读取的src,这样就可以转化为Qt的类型了

	QImage kk = cvMat2QImage(src);
	QPixmap kk3 = QPixmap::fromImage(kk);

2.读取地址错误的的问题
我是采用 opencv的imread函数读取的图片,从qt的textBrowser读取的值。
首先要把读取的Qstring转化为opencv的string格式

    QString textstring = ui.textBrowser_2->toPlainText();;
	string s2 = textstring.toStdString();

通过这一步可以将Qstring转化为string
然后将斜杠替换("/", “\”);
在这里插入图片描述
这里是第一个坑
使用自带的函数

PathName.replace("/", "\\");

这样无法换,需要四个斜杠才行,原因不清楚

PathName.replace("/", "\\\\");

这样才能将"/",替换为"\";

下一个坑就是天坑了,明明路径都是正确的,有些图片读不出来,有些能读出来,后来我打断点发现是系统bug,读取有时候在路径前面会有一个问号,但是在QT的界面却不会显示
在这里插入图片描述
在这个C前面有时会有问号,替换掉就行

PathName.replace("?", "");

然后是QT的中英文转换问题,从修正路径textBrowser_2读取带有中文的路径时,会出现乱码,使用XXXXXXX.toLocal8Bit();这个函数修正中文的错误,避免出现乱码

    QString textstring = ui.textBrowser_2->toPlainText();;
	string s2 = textstring.toStdString();
	QByteArray mm = textstring.toLocal8Bit();//中文修复
	string str = string(mm);
	Mat src = imread(str);

然后就可以使用一些Opencv算法之类的去处理啦,终于好了!这个是个分水岭算法
在这里插入图片描述

(好久没有回来写CSDN的博客了,一天天这么混下去什么记忆都没有,还是回来好好写吧,以后看着还能想起来。)
PS:想念我小于师妹。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值