OpenCV寒假學習day03
1.邏輯操作&取反操作
代碼
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char* argv[])
{
// create image one
Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3);
Rect rect(100, 100, 100, 100);
src1(rect) = Scalar(0, 0, 255);
imshow("input1", src1);
printf("create first image...\n");
// create image two
Mat src2 = Mat::zeros(Size(400, 400), CV_8UC3);
rect.x = 150;
rect.y = 150;
src2(rect) = Scalar(0, 0, 255);
imshow("input2", src2);
printf("create second image...\n");
// 邏輯操作
Mat dst1, dst2, dst3;
bitwise_and(src1, src2, dst1);
bitwise_xor(src1, src2, dst2);
bitwise_or(src1, src2, dst3);
// show results
imshow("dst1", dst1);
imshow("dst2", dst2);
imshow("dst3", dst3);
Mat src = imread("D:/vcprojects/images/test.png");
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
// 取反操作
Mat dst;
bitwise_not(src, dst);
imshow("dst", dst);
waitKey(0);
return 0;
}
運行結果
重要函數 |
功能 |
bitwise_and(src1,src2,dst) |
逐元素按位與操作 |
bitwise_xor(src1,src2,dst) |
逐元素按位“異或”操作 |
bitwise_or(src1,src2,dst) |
逐元素按位或操作 |
bitwise_not(src,dst) |
逐元素取反操作 |
Rect(x,y,width,height) |
創建矩形 |
2.OpenCV通道分離與合併
代碼
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char* argv[])
{
Mat src = imread("D:/vcprojects/images/flower.png");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
vector<Mat> mv;
Mat dst1, dst2, dst3;
// 藍色通道爲零
split(src, mv);
mv[0] = Scalar(0);
merge(mv, dst1);
imshow("output1", dst1);
// 綠色通道爲零
split(src, mv);
mv[1] = Scalar(0);
merge(mv, dst2);
imshow("output2", dst2);
// 紅色通道爲零
split(src, mv);
mv[2] = Scalar(0);
merge(mv, dst3);
imshow("output3", dst3);
waitKey(0);
return 0;
}
運行結果
重要函數 |
功能 |
split(src,mv) |
將src的多通道矩陣分成多個單通道矩陣並保留到Mat對象指針 |
merge(mv,dst) |
split的逆操作,把mv中的數組矩陣合併到dst中的矩陣 |
3.顏色空間轉換
代碼
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char* argv[])
{
Mat src = imread("D:/vcprojects/images/dog.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
// RGB to HSV
Mat hsv;
cvtColor(src, hsv, COLOR_BGR2HSV);
imshow("hsv", hsv);
// RGB to YUV
Mat yuv;
cvtColor(src, yuv, COLOR_BGR2YUV);
imshow("yuv", yuv);
// RGB to YUV
Mat ycrcb;
cvtColor(src, ycrcb, COLOR_BGR2YCrCb);
imshow("ycrcb", ycrcb);
Mat src2 = imread("D:/vcprojects/images/greenback.png");
imshow("src2", src2);
cvtColor(src2, hsv, COLOR_BGR2HSV);
Mat mask;
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
imshow("mask", mask);
waitKey(0);
return 0;
}
運行結果
重要函數 |
|
cvtColor(src,dst,code) |
保留相同數據類型的同時從一個顏色空間轉換到另一個顏色空間 |
inRange(src,upperb,lowerb,dst) |
src的每個元素在upperb和lowerb中對應的校驗,如src中的元素爲upperb和lowerb之間的,則dst對應的元素爲255否則爲0 |
4.問題
暫無
5.總結
這次學習了像素的邏輯操作,圖像的通道分離與合併及顏色空間轉換。接下來需要了解的是有關於顏色空間的知識和,通道分離與合併的實用意義。