Qt 5使用中の経験まとめ
2423 ワード
1.データ型変換
1.intタイプをQStringタイプに変換するには:
int tmp = 100;
QString str = QString::number(tmp);
QStringをintタイプに変換するには:
QString str("100");
int tmp = str.toInt();
2.QString文字列接合
QString str1 = "hello "; QString str2 = "world"; str1.append(str2); //str1 = "hello world"str1.append("!"); //str1 = "hello world !"//文字列に直接+別の文字列でも実現できますが、元の文字列に対してQString str 3=str 1+str 2+"!"; //str3 = "hello world !" str1 = "hello "
2.qt5+opencv3.4.2で使用中の問題
1.qt5+opencv3.4.2でのimshowによるプログラム終了
画像アドレスが間違っていて、絶対アドレスで成功しなければなりません.相対アドレスは成功しません.
2.シングルチャネル画像MatをQimageに変換すると、ウィンドウコントロールで表示され、画像が斜めになる
幅が4の整数倍でない場合、画像が傾きます.
原因分析:
QImageをFormat_に変換RGB 888などのフォーマットの場合、行ごとに4バイト(32ビット)で揃え、不足すると自動的に揃える
しかしrgb.dataのデータは自動的に整列していないため、画像がQImageとして表示される場合、傾きが発生しますので、以下のようにコードを記述する必要があります.
Mat rgb;
QImage img;
if(mat.channels() == 3) // RGB image
{
cvtColor(mat,rgb,CV_BGR2RGB);
img = QImage((const uchar*)(rgb.data), //(const unsigned char*)
rgb.cols,rgb.rows,
rgb.cols*rgb.channels(), //new
QImage::Format_RGB888);
}else // gray image
{
img = QImage((const uchar*)(mat.data),
mat.cols,mat.rows,
mat.cols*mat.channels(), //new
QImage::Format_Indexed8);
}
3.直接付与値は浅いコピーのみであり、clone関数を使用して深いコピーを行う必要がある
Mat faceimage=img.clone();// ,img Mat
4.サブスレッドでのimshow関数の使用
Opencvマルチスレッドを使用してopencvのimshowを使用して画像を表示する場合、画像が更新されない場合が多い(ただし、実際のメモリデータは変化している)が、複数回の試験を経て、画像表示が更新されない方法を一時的に解決できることが分かった.
1 .まず、すべての画像を1つのスレッドに表示し、そのスレッドに統一的に表示します.
2.表示コード:
Mat a;//aは絶えず更新される
namedWindow("img");
imshow("img",a);
startWindowThread();//画像の更新が始まる
waitKey(20);//20 ms、ここでパラメータの選択は具体的なピクチャサイズによって決めるのが望ましい.すなわち、画像が大きいほど、最後の時間が大きくなります.
3.Qtでc++11を使用
ステップ1:proファイルに追加
CONFIG += c++11 // C++11
ステップ2:ヘッダファイルとネーミングスペースを含む
#include
using namespace std;
4.プログラムの現在のスレッド番号を取得する
qDebug()<<:currentthreadid/>