C++ OpenCV制作黑客帝國風(fēng)格的照片
前不久,黑客帝國系列最新的 《矩陣重啟》 上映了。黑客帝國是早期科幻類型的翹楚。但是這次有點(diǎn)垮了。豆瓣評(píng)分不到6分。
小的時(shí)候,看到黑客帝國的那些照片,一串串?dāng)?shù)字從上而下, 感覺特別酷炫。 今天我們就來看看怎么制作類似的效果。
準(zhǔn)備工作
一張基努里維斯的照片

準(zhǔn)備好項(xiàng)目需要使用到的庫 opencv,在 CMakeLists.txt 里配置完成。
cmake_minimum_required(VERSION 3.17)
project(opencv_demo)
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV 4 REQUIRED)
include_directories(
? ? ? ? ${OPENCV_INCLUDE_DIRS}
)
add_executable(opencv_demo main.cpp)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})開始寫代碼
開始寫讀取文件的代碼
std::string path = "path/to/img"; cv::Mat img = cv::imread(path);
獲取到圖像的寬高
int height = img.rows; int width = img.cols; int cellHeight = 20, cellWidth = 20;
做一次圖片的縮放,然后進(jìn)行圖片的取色操作
cv::Mat img2 = img.clone();
cv::resize(img, img2, cv::Size((width/ cellWidth), (height / cellHeight)), 0.0, 0.0, cv::INTER_NEAREST);
新建一個(gè)圖片,用于放置 0 1 數(shù)字,需要注意的是,這里建立的新圖片需要和原圖的尺寸,顏色通道數(shù)等等都是相同的才行,否則后續(xù)合并圖片的時(shí)候,會(huì)有問題。
cv::Mat newImg = cv::Mat::zeros(height, width, CV_8UC3);
對(duì)新圖片進(jìn)行涂色添加文字處理
for (int i = 0; i < newHeight; ++i) {
for (int j = 0; j < newWidth; ++j) {
cv::Scalar color = img2.at<cv::Vec3b>(i, j);
int b = color[0];
int g = color[1];
int r = color[2];
int k = (b + g + r) / 3;
if (k < 128) {
cv::putText(newImg, "1", cv::Point(j*cellWidth, i * cellHeight),cv::FONT_HERSHEY_COMPLEX_SMALL,0.7,cv::Scalar(0,g, 0));
} else {
cv::putText(newImg, "0", cv::Point(j*cellWidth, i * cellHeight),cv::FONT_HERSHEY_COMPLEX_SMALL,0.7,cv::Scalar(0,g, 0));
}
}
}
到這一步我們的工作基本已經(jīng)完成了。 再進(jìn)行一次圖片合成,就OK了。
cv::addWeighted(img, 0.2, newImg , 0.8 , 0, img);
最終效果圖

完整代碼
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
? ? std::string path = "path/to/img";
? ? cv::Mat img = cv::imread(path);
? ?
? ? int height = img.rows;
? ? int width = img.cols;
? ? int cellHeight = 20, cellWidth = 20;
? ? cv::Mat img2 = img.clone();
? ? cv::resize(img, img2, cv::Size((width/ cellWidth), (height / cellHeight)), 0.0, 0.0, cv::INTER_NEAREST);
? ? int newWidth = img.cols;
? ? int newHeight = img.rows;
? ? cv::Mat newImg = cv::Mat::zeros(height, width, CV_8UC3);
? ??
? ? for (int i = 0; i < newHeight; ++i) {
? ? ? ? for (int j = 0; j < newWidth; ++j) {
? ? ? ? ? ? cv::Scalar color = img2.at<cv::Vec3b>(i, j);
? ? ? ? ? ? int b = color[0];
? ? ? ? ? ? int g = color[1];
? ? ? ? ? ? int r = color[2];
? ? ? ? ? ? int k = (b + g + r) / 3;
? ? ? ? ? ? if (k < 128) {
? ? ? ? ? ? ? ? cv::putText(newImg, "1", cv::Point(j*cellWidth, i * cellHeight),cv::FONT_HERSHEY_COMPLEX_SMALL,0.7,cv::Scalar(0,g, 0));
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? cv::putText(newImg, "0", cv::Point(j*cellWidth, i * cellHeight),cv::FONT_HERSHEY_COMPLEX_SMALL,0.7,cv::Scalar(0,g, 0));
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ??
? ? cv::addWeighted(img, 0.2, newImg , 0.8 , 0, img);
? ? cv::imshow("def", img);
? ? cv::waitKey(0);
}總結(jié)
本文通過使用opencv 的取色, 上色, 圖片合并功能達(dá)到我們想要的效果。
到此這篇關(guān)于C++ OpenCV制作黑客帝國風(fēng)格的照片的文章就介紹到這了,更多相關(guān)OpenCV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言如何實(shí)現(xiàn)一些算法或者函數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)一些算法或者函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Qt GUI圖形圖像開發(fā)之QT表格控件QTableView,QTableWidget復(fù)雜表頭(多行表頭) 及凍結(jié)、固定特
這篇文章主要介紹了Qt GUI圖形圖像開發(fā)之QT表格控件QTableView,QTableWidget復(fù)雜表頭(多行表頭) 及凍結(jié)、固定特定的行的詳細(xì)方法與實(shí)例,需要的朋友可以參考下2020-03-03
動(dòng)態(tài)數(shù)組C++實(shí)現(xiàn)方法(分享)
下面小編就為大家?guī)硪黄獎(jiǎng)討B(tài)數(shù)組C++實(shí)現(xiàn)方法(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析
直方圖均衡化是通過拉伸像素強(qiáng)度分布范圍來增強(qiáng)圖像對(duì)比度的一種方法,今天通過本文給大家介紹OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧2022-01-01

