1. 程式人生 > >OpenCV學習筆記_實現馬賽克功能

OpenCV學習筆記_實現馬賽克功能

實現用按下滑鼠左鍵拖動時,在滑鼠經過的路徑上打上馬賽克。

馬賽克的原理是將影象中選中區域的畫素用這個選中區域中的某一畫素覆蓋。

為了不讓滑鼠重複經過影象中同一個的時候,選取不一樣的畫素,該程式將在輸入圖片的時候,就實現了全圖的馬賽克效果。而當滑鼠劃過的時候,程式只是將實現馬賽克的圖片的指定位置複製到顯示的影象中。效果類似於QQ截圖中的馬賽克。

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

Mat inputImage;
Mat inputImage_mosaic;
Mat inputImage_clone;

//馬賽克的大小
int neightbourhood = 20;

//記錄滑鼠的狀態,0為滑鼠左鍵未按下或彈起,1為滑鼠左鍵按下
int mouseStatus = 0;

void onMouse(int events, int x, int y, int flag, void* ustg);

//建立馬賽克圖片
void createMosaicImage(Mat inputMat, Mat& outputMat, int size);

//設定馬賽克區域
void setMosaic(Mat& inputMat, Rect rect);

int main(void){
	inputImage = imread("test2.jpg");
	inputImage_clone = inputImage.clone();
	createMosaicImage(inputImage, inputImage_mosaic, neightbourhood);

	namedWindow("showImage", 0);
	setMouseCallback("showImage", onMouse);

	waitKey();
	return 0;
}

void createMosaicImage(Mat inputMat, Mat& outputMat, int size){
	RNG rng;
	int height = inputMat.rows;
	int width = inputMat.cols;
	Mat padding;
	Mat tempMat;

	//為了方便後面的計算,將輸入的影象大小擴充到寬高都是size的倍數
	copyMakeBorder(inputMat, padding, 0, size - inputMat.rows % size, 0, size - inputMat.cols % size, BORDER_REPLICATE);
	tempMat = padding.clone();
	
	for (int row = 0; row < padding.rows; row += size){
		for (int col = 0; col < padding.cols; col += size){
			int rand_x = rng.uniform(0, size);
			int rand_y = rng.uniform(0, size);
			Rect rect = Rect(col, row, size, size);
			Mat roi = tempMat(rect);
			Scalar color = Scalar(padding.at<Vec3b>(row + rand_y, col + rand_x)[0], \
				padding.at<Vec3b>(row + rand_y, col + rand_x)[1], \
				padding.at<Vec3b>(row + rand_y, col + rand_x)[2]);
			roi.setTo(color);
		}
	}
	outputMat = tempMat(Rect(0, 0, width, height)).clone();
}

void setMosaic(Mat& inputMat, Rect rect){
	Mat roi = inputMat(rect);
	Mat tempRoi = inputImage_mosaic(rect);
	tempRoi.copyTo(roi);
}

void onMouse(int events, int x, int y, int flag, void* ustg){

	//當滑鼠移除圖片區域的時候,不做操作
	if (x < 0 || x > inputImage.cols || y < 0 || y > inputImage.rows){
		return;
	}

	//馬賽克塊的位置資訊
	int x_left, x_right, y_top, y_bottom;
	x - neightbourhood <= 0 ? x_left = 0 : x_left = x - neightbourhood;
	x + neightbourhood > inputImage.cols ? x_right = inputImage.cols: x_right = x + neightbourhood;
	y - neightbourhood <= 0 ? y_top = 0 : y_top = y - neightbourhood;
	y + neightbourhood > inputImage.rows ? y_bottom = inputImage.rows: y_bottom = y + neightbourhood;

	if (events == CV_EVENT_LBUTTONDOWN){
		mouseStatus = 1;
		setMosaic(inputImage_clone, Rect(x_left, y_top, x_right - x_left, y_bottom - y_top));
	}
	else if (events == CV_EVENT_MOUSEMOVE){
		if (mouseStatus == 1){
			setMosaic(inputImage_clone, Rect(x_left, y_top, x_right - x_left, y_bottom - y_top));
		}
		else{
			//nothing
		}
	}
	else if (events == CV_EVENT_LBUTTONUP){
		mouseStatus = 0;
	}
	else {
		//cout << "nothing" << endl;
	}
	imshow("showImage", inputImage_clone);
}
效果圖

相關推薦

OpenCV學習筆記_實現馬賽克功能

實現用按下滑鼠左鍵拖動時,在滑鼠經過的路徑上打上馬賽克。 馬賽克的原理是將影象中選中區域的畫素用這個選中區域中的某一畫素覆蓋。 為了不讓滑鼠重複經過影象中同一個的時候,選取不一樣的畫素,該程式將在輸入圖片的時候,就實現了全圖的馬賽克效果。而當滑鼠劃過的時候,程式只是將實現馬

opencv學習筆記python實現 影象金字塔(高斯金字塔與拉普拉斯金字塔)

使用拉普拉斯金字塔時,影象必須是2^n*2*m 使用拉普拉斯金字塔先要知道高斯金字塔 這兩種過程是圖片縮小與放大 縮小   reduce =  高斯模糊 + 降取樣(pyrDown) 放大    expand = 擴大(升取樣/pyrUp) + 卷積 #-*-c

opencv學習筆記 python實現 影象梯度與影象邊緣

        影象梯度即求導數,導數能反映出影象變化最大的地方,影象變化最大的地方也就是影象的邊緣。         詳細見程式碼註釋,通俗易懂   sobel運算元與scharr運算元     在sobel運算元不能明顯反映影象邊緣時就換用scharr運算元    

Opencv學習筆記_計算機視覺是什麼?Opencv的起源

從0開始學習“OPENCV”第一天-概述在學習任何一門新的語言或者框架時都應該瞭解這個行業的背景知識,正所謂工欲善其事,必先利其器!                     一、Opencv概述1.      什麼是計算機視覺?計算機視覺有多難、1.1     什麼是計算機視

OpenCV學習筆記_圖片融合cvAddWeighted

/*使用cvAddWeighted函式將兩張圖片進行融合時,載入圖片的型別要是相同的*/ int main(void){ IplImage* src1; IplImage* src2; if

OpenCV學習筆記_播放視訊及重新整理跟蹤條

#include <cv.h> #include <highgui.h> using namespace std; //記錄當前位置 int g_slider_positi

OpenCV學習筆記_影象細化

#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using name

OpenCV學習筆記_縮放圖片

#include <cv.h> #include <highgui.h> using namespace std; IplImage* doPyrDown(IplImag

OpenCV學習筆記_影象轉換cvCvtColor、通道分割cvSplit以及通道合併cvMerge

#include<cv.h> #include<highgui.h> using namespace std; int main(void){ IplImage* cur

OpenCV學習筆記_直方圖均衡化cvEqualizeHist

#include<cv.h> #include<highgui.h> using namespace std; int main(void){ IplImage* cur

OpenCV學習筆記_呼叫攝像頭錄製視訊(無聲音)

#include <cv.h> #include <highgui.h> using namespace std; int main(void){ cvNamedWind

OPENCV學習筆記16_用控制器設計模式實現功能模塊間通信

.get src read require char http result div exe   在構建更復雜的程序時,需要創建多個算法來協同工作,以實現一些高級功能。要合理地構建程序並讓所有的類能互相通信,程序將會變得越來越復雜。因此在一個類中集中對程序進行控制,是非常有

[知了堂學習筆記]_純JS制作《飛機大戰》遊戲_第1講(實現思路與遊戲界面的實現)

hid width 解決 -1 出現 span port webkit rom 整體效果展示: 一、實現思路 如圖,這是我完成該項目的一個邏輯圖,也是一個功能模塊完成的順序圖。 遊戲界面的完成 英雄飛機對象實現,在實現發射子彈方法過程中,又引出了子彈對象並實現。

[知了堂學習筆記]_純JS制作《飛機大戰》遊戲_第3講(邏輯方法的實現)

了解 隱藏 div 開始遊戲 創建對象 eve 我們 span nbsp 整體展示: 上一講實現了諸多對象,這次我們就需要實現許多邏輯方法,如控制飛機移動,判斷子彈擊中敵機,敵機與英雄飛機相撞等等。並且我們在實現這些功能的時候需要計時器去調用這些方法。setInt

opencv學習筆記(三):幾種去噪濾波器的實現

現在在上數字影象處理的課程,最近的一次作業要求不用OpenCV自帶的濾波器函式來實現幾種濾波器,以實現對加入椒鹽噪聲的影象的去噪。也是對markdown編輯器的一次練習。 椒鹽噪聲 椒鹽噪聲是一種很簡單的噪聲,即隨機將影象中一定數量的畫素點設定為0(黑)

OpenCv學習筆記(五)-數學形態學2(灰度級膨脹和腐蝕及c語言實現

一 基本概念 所謂的灰度級膨脹和腐蝕即將而知影象的二值形態學運算推廣到灰度影象上。對於一幅影象的腐蝕(膨脹)運算定義為對每個畫素賦值為某個領域內輸入影象灰度級的最小(或最大值)。在二值變換中的結構元素只代表一個領域,而在灰度級變化中,結構元素是一個二元函式,它規定了希

OpenCV學習筆記(二):SVM+HOG實現的行人檢測

因為一個專案的需求接觸到OpenCV裡的SVM和HOG特徵演算法,根據網上的教程一個部落格,給自己準備了一個關於行人檢測demo,裡面也有一些程式碼也是參考網上的demo,這裡大致記錄下demo的程式碼和自己的遇到的一些小問題。 參考部落格/文章: HOG+SVM行人檢測 目標檢測的影象特徵

OpenCV學習筆記 019】SIFT和SURF演算法實現目標檢測

一、SIFT和SURF運算元實現特徵點檢測 概述 在OpenCV的features2d中實現了SIFT和SURF演算法,可以用於影象特徵點的自動檢測。具體實現是採用SiftFeatureDetector/SurfFeatureDetector類的detect函式檢測SIFT

OpenCV學習筆記 020】K-Means聚類演算法介紹及實現

一、K-Means演算法介紹 在資料探勘中,K-Means演算法是一種cluster analysis的演算法,其主要是來計算資料聚集的演算法,主要通過不斷地取離種子點最近均值的演算法。 問題 K-Means演算法主要解決的問題如下圖所示。我們可以看到,在圖的左邊有一些點,

python學習筆記實現一個遍歷檔案尋找字串的功能

為了熟練使用python,打算有事沒事用python寫一些實用的小指令碼 我剛剛進入計算機專業一年,一些專業用語不是很清楚,有說錯的地方歡迎大家批評指正 -----------------------