jashliao 用 VC++ 實現 fanfuhan OpenCV 教學003 ~ opencv-003-圖像對象(Mat)創建與賦值 [圖片拷貝(複製)、建立空白畫布、建立運算濾波器(Filter)]
jashliao 用 VC++ 實現 fanfuhan OpenCV 教學003 ~ opencv-003-圖像對象(Mat)創建與賦值 [圖片拷貝(複製)、建立空白畫布、建立運算濾波器(Filter)]
	
資料來源: https://fanfuhan.github.io/
https://fanfuhan.github.io/2019/03/21/opencv-003/
GITHUB:https://github.com/jash-git/fanfuhan_ML_OpenCV
https://github.com/jash-git/jashliao-implements-FANFUHAN-OPENCV-with-VC
	
	★前言:

	★主題:
    OPENCV中使用『Mat型態變數』實作圖片拷貝(複製)、建立空白畫布、建立運算遮罩(mask)
	
★C++
// VC_FANFUHAN_OPENCV003.cpp : 定義主控台應用程式的進入點。
//
#include "stdafx.h"
/*
// Debug | x32
通用屬性
| C/C++
|	| 一般
|		| 其他 Include 目錄 -> C:\opencv\build\include
|
| 連結器
| 	|一一般
|		|  其他程式庫目錄 -> C:\opencv\build\x64\vc15\lib
|
| 	|一輸入
|		| 其他相依性 -> opencv_world411d.lib;%(AdditionalDependencies)
// Releas | x64
組態屬性
| C/C++
|	| 一般
|		| 其他 Include 目錄 -> C:\opencv\build\include
|
| 連結器
| 	|一般
|		| 其他程式庫目錄 -> C:\opencv\build\x64\vc15\lib
|
| 	|一輸入
|		| 其他相依性 -> opencv_world411.lib;%(AdditionalDependencies)
*/
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
void pause()
{
	printf("Press Enter key to continue...");
	fgetc(stdin);
}
int main()
{
	Mat src = imread("../../images/l_hires.jpg");//IDE 測試路徑
	//Mat src = imread("../../../images/l_hires.jpg");//執行檔 測試路徑
	if (src.empty()) {
		cout << "could not load image..." << endl;
		pause();
		return -1;
	}
	else
	{
		// 通过克隆或复制创建图像对象,m1和src指向不同内存块
		Mat m1 = src.clone();
		Mat m2;
		src.copyTo(m2);
		// 赋值法,m3和src指向同一内存块
		Mat m3 = src;
		namedWindow("input");
		imshow("input", m3);
		// 创建空白图像
		Mat m4 = Mat::zeros(src.size(), src.type());
		Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);
		Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);
		Mat m7 = Mat(Size(512, 512), CV_8UC3,Scalar(255,255,255));//白色畫布
		namedWindow("m4-input(zeros)");
		imshow("m4-input(zeros)", m4);
		namedWindow("m5-Size(512, 512)[zeros]");
		imshow("m5-Size(512, 512)[zeros]", m5);
		namedWindow("m6-Size(512, 512)[ones]");
		imshow("m6-Size(512, 512)[ones]", m6);
		namedWindow("m7-Size(512, 512)[Scalar(255,255,255)]");
		imshow("m7-Size(512, 512)[Scalar(255,255,255)]", m7);
		// kernel: [0, -1, 0
		//          -1, 5, -1
		//          0, -1, 0]
		Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
		waitKey(0);
	}
	return 0;
} 
 
 
★Python
import cv2 as cv
import numpy as np
src = cv.imread("../images/liuyifei_1.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
# 克隆图像
m1 = np.copy(src)
# 赋值
m2 = src
src[100:200,200:300,:] = 255 # 第三维代表图像通道
cv.imshow("m2",m2)
m3 = np.zeros(src.shape, src.dtype)
cv.imshow("m3", m3)
m4 = np.zeros([512,512], np.uint8)
# m4[:,:] =127 try to give gray value 127
cv.imshow("m4", m4)
m5 = np.ones(shape=[512,512,3], dtype=np.uint8)
m5[:,:,0] = 255
cv.imshow("m5", m5)
cv.waitKey(0)
cv.destroyAllWindows()
	
★結果圖:
	 
	
★延伸說明/重點回顧:
OPENCV的(Mat::zeros、Mat::ones)空白畫布預設都是黑底
	    OPENCV使用Scalar(255,255,255)建立非黑色底(白色)畫布