2019年11月17日 星期日

VS 2013 with Qt 5.8.0 install 環境建置

Step1.先下載Qt5.8.0(https://download.qt.io/archive/qt/5.8/5.8.0/)
,因為我的電腦是64位元、VS2013,所以選擇如下。

跟Qt-vsaddin tool(https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools),如下所示。

Step2.開始安裝嘍,首先先安裝Qt5.8.0
我沒有帳號,只好跳過瞜
設定安裝的路徑,可以自由選擇位置,並完成安裝。
再來就是安裝Qt-vsaddin tool,就是下一步就對了....





Step3.開啟VS 2013,確認是否有多一個Qt的Tool選項。

Step4.設定Qt的路徑,點選QT VS TOOLS中的Qt options。

先Add一個新路徑,名稱會在路徑設定完成後自己產生,將新路徑設定為自己安裝Qt資料夾中的msvc2013_64。

Step5.建立專案,選擇Qt中的Qt GUI Application



按下一步後,要選取常用的三個,分別是Core、GUI、Widgets
最後按下完成就可以了。




Step6.最後找尋自己安裝Qt資料夾中的msvc2013_64\bin,複製所有的dll檔,並放入到專案中的Release&Debug後,執行可跳出platform,即代表順利將環境建置完成摟~~

2019年9月22日 星期日

OpenCV clone、copyTo(影像複製)

在影像處理中,往往需要將特定的影像進行複製,在這邊介紹一下我在OpenCV常用的影像複製,主要有兩種方式,第一種為clone、第二種為copyTo,因為運算子 = 有時會被混淆,所以我會一起做說明。



運算子=


利用運算子=的方式,使得DogImg 與DogCloneImg 都會指到同一個記憶體空間,所以在使用
完threshold,兩張影像都會一起被處理,其概念就像是c++中,指標指到一樣地方,故會一起被修改。


////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat DogCloneImg;

DogCloneImg = DogImg;
threshold(DogImg, DogImg, 150, 255, CV_THRESH_BINARY);

imshow("DogImg", DogImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;

}
/////////-------------

結果圖:





複製方法一(clone)


因為是使用clone,所以DogImg 的記憶體位置被改變了,且複製了CatImg的影像數據
,並因為記憶體位置被改變,所以DogCloneImg 影像數據沒有被改變。


////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(){
Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_COLOR);
Mat CatImg = imread("cat1.jpg", CV_LOAD_IMAGE_COLOR);
Mat DogCloneImg;

resize(DogImg, DogImg, Size(CatImg.cols, CatImg.rows));

DogCloneImg = DogImg;
DogImg = CatImg.clone();

imshow("DogImg", DogImg);
imshow("CatImg", CatImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;
}
/////////-------------

結果圖:

複製方法二(copyTo與原尺寸相同情況下 )

因為是使用copyto且DogImg與CatImg尺寸相同 ,所以不會改變DogImg 的記憶體位置,並
因為DogImg 與DogCloneImg 記憶體位置相同,所以在將CatImg的影像數據複製給DogImg 時
DogCloneImg也一起被改變。

////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_COLOR);
Mat CatImg = imread("cat1.jpg", CV_LOAD_IMAGE_COLOR);
Mat DogCloneImg;

resize(DogImg, DogImg, Size(CatImg.cols, CatImg.rows));

DogCloneImg = DogImg;
CatImg.copyTo(DogImg);

imshow("DogImg", DogImg);
imshow("CatImg", CatImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;

}

/////////-------------
結果圖:

複製方法二(copyTo與原尺寸不相同情況下 )

因為是使用copyto且拿掉resize,所以DogImg與CatImg尺寸不相同 ,因此雖然一樣是使用copyto,但會先建立新的記憶體位置,所以結果會與clone複製一樣,而DogCloneImg尺寸會保持原大小。

////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_COLOR);
Mat CatImg = imread("cat1.jpg", CV_LOAD_IMAGE_COLOR);
Mat DogCloneImg;

//resize(DogImg, DogImg, Size(CatImg.cols, CatImg.rows));

DogCloneImg = DogImg;
CatImg.copyTo(DogImg);

imshow("DogImg", DogImg);
imshow("CatImg", CatImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;

}

/////////-------------
結果圖:

2019年3月16日 星期六

OpenCV 影像讀取(imread)、影像建立(Mat & create)、影像顯示(imshow)、影像儲存(imwrite)

OpenCV 影像讀取(imread)、影像建立(Mat & create)、影像顯示(imshow)、影像儲存(imwrite)


影像屬性

首先,我們要先了解一張影像的屬性,常有的屬性如下:

1.影像長(cols)與寬(rows)
2.影像顏色,一般分成彩色(color image)與灰階(gray image),因彩色至少有三種顏色組成,所以為三通道,灰階則為一通道組成。
3.影像深度(depth),代表影像要使用多大的空間去儲存影像資料,如CV_8U,代表空間是8位元無符號。
4.影像類型(Type),除了第三點提到的深度資訊外,再額外包含通道數,看你是彩色還是單色。如果是8位元無符號的三通道影像,就是CV_8UC3。


影像讀取(imread)

Mat imread( const String& filename, int flags = IMREAD_COLOR );

const String& filename:代表讀檔的檔名
int flags = IMREAD_COLOR:代表影像讀進來的顏色模式,最常選擇彩色、灰階、原影像等模式
然後回傳矩陣。


影像建立(Mat & create)

Mat(int rows, int cols, int type, const Scalar& s);
一般我都是用這個建立影像空間

int rows:代表欲建立影像之高度
int cols:代表欲建立影像之寬度
int type:代表欲建立影像類型
const Scalar& s:代表欲建立影像亮度值

Mat::create(int rows,int cols, int type )
主要用於重新分配影像大小、空間與通道用

int rows:代表欲建立影像之高度
int cols:代表欲建立影像之寬度
int type:代表欲建立影像類型

例如:
Mat SampleImg(50, 50, CV_32FC3, Scalar(255, 0, 0));
SampleImg.create(100, 60, CV_8UC(3));//改成100 x 60  CV_8U 三通道的影像

影像顯示(imshow)

void imshow(const String& winname, InputArray mat);

const String:代表顯示的視窗名稱
InputArray mat:代表欲顯示的影像矩陣


影像儲存(imwrite)

bool imwrite( const String& filename, InputArray img,const std::vector);

const String& filename:代表欲儲存的影像檔名(包含影像格式,常見的有bmp、png、jpg等..)
InputArray img:代表欲儲存的影像矩陣
const std::vector():代表設定的影像品質,可寫可不寫,如果想設定可參考下方寫法

vector<int> ImageQuality;
ImageQuality.push_back(CV_IMWRITE_JPEG_QUALITY);
ImageQuality.push_back(80); //自行設定壓縮品質,如果沒有額外設定,預設就是95
imwrite("MyGreenImg.bmp", GreenImg, ImageQuality);


///////------------------------------------------我是分隔線------------------

#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat GreenImg(500, 500, CV_8UC3, Scalar(0, 255, 0));//建立一張影像500 x 500 三通道 全綠色

imshow("GreenImg", GreenImg);
imwrite("MyGreenImg.bmp", GreenImg);//儲存一張影像,名字為MyGreenImg,副檔名為bmp

Mat LoadGreenImg = imread("MyGreenImg.bmp", CV_LOAD_IMAGE_COLOR);//讀取上面儲存的影像
imshow("LoadGreenImg", LoadGreenImg);

waitKey(0);
return 0;
}

///////------------------------------------------我還是分隔線--------------

跑出來的結果會有兩張影像,分別為自己建立的純綠色影像,另一個則是讀取剛剛儲存的影像並顯示~