欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ OpenCV制作黑客帝國(guó)風(fēng)格的照片

 更新時(shí)間:2022年01月23日 14:43:46   作者:青空coding  
這篇文章主要介紹了如何通過(guò)C++ OpenCV制作出黑客帝國(guó)風(fēng)格的照片,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下

前不久,黑客帝國(guó)系列最新的 《矩陣重啟》 上映了。黑客帝國(guó)是早期科幻類型的翹楚。但是這次有點(diǎn)垮了。豆瓣評(píng)分不到6分。

小的時(shí)候,看到黑客帝國(guó)的那些照片,一串串?dāng)?shù)字從上而下, 感覺(jué)特別酷炫。 今天我們就來(lái)看看怎么制作類似的效果。

準(zhǔn)備工作

一張基努里維斯的照片

準(zhǔn)備好項(xiàng)目需要使用到的庫(kù) 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})

開(kāi)始寫代碼

開(kāi)始寫讀取文件的代碼

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ì)有問(wèn)題。

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é)

本文通過(guò)使用opencv 的取色, 上色, 圖片合并功能達(dá)到我們想要的效果。

到此這篇關(guān)于C++ OpenCV制作黑客帝國(guó)風(fēng)格的照片的文章就介紹到這了,更多相關(guān)OpenCV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 針對(duì)Ruby的Selenium WebDriver安裝指南

    針對(duì)Ruby的Selenium WebDriver安裝指南

    這篇文章主要介紹了針對(duì)Ruby的Selenium WebDriver安裝指南,Selenium直接運(yùn)行于瀏覽器之中,是進(jìn)行各種調(diào)試的一大神器,需要的朋友可以參考下
    2015-07-07
  • C語(yǔ)言冷知識(shí)之預(yù)處理字符串操作符詳解

    C語(yǔ)言冷知識(shí)之預(yù)處理字符串操作符詳解

    當(dāng)年學(xué)習(xí)C語(yǔ)言的第一門課就提到過(guò)標(biāo)記(Token)的概念,不過(guò),相信在多年之后你再次聽(tīng)到這個(gè)術(shù)語(yǔ)時(shí)會(huì)一臉懵逼,比如我。因此特地翻了翻資料,整理下來(lái)這些筆記,希望對(duì)大家有所幫助
    2022-11-11
  • Qt網(wǎng)絡(luò)編程之TCP通信及常見(jiàn)問(wèn)題

    Qt網(wǎng)絡(luò)編程之TCP通信及常見(jiàn)問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了Qt網(wǎng)絡(luò)編程之TCP通信及常見(jiàn)問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++報(bào)錯(cuò) XX does not name a type;field `XX’ has incomplete type的解決方案

    C++報(bào)錯(cuò) XX does not name a type;

    這篇文章主要給大家介紹了C++報(bào)錯(cuò) XX does not name a type;field `XX’ has incomplete type解決方案,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • C語(yǔ)言中的四種常量詳解

    C語(yǔ)言中的四種常量詳解

    本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家
    2021-10-10
  • linux c模擬ls命令詳解

    linux c模擬ls命令詳解

    本篇文章是對(duì)linux中基于c模擬ls命令的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • win32 api實(shí)現(xiàn)2048游戲示例

    win32 api實(shí)現(xiàn)2048游戲示例

    這篇文章主要介紹了win32 api實(shí)現(xiàn)2048游戲示例,需要的朋友可以參考下
    2014-05-05
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托

    Qt中需要用到自定義委托的情形很多,比如提供下拉框選擇,進(jìn)度條展示下載進(jìn)度啥的,默認(rèn)的單元格是沒(méi)有這些效果的,需要自己?jiǎn)为?dú)用委托的形式來(lái)展示。本文將為大家介紹Qt中如何進(jìn)行超級(jí)自定義委托,需要的可以參考一下
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C語(yǔ)言中對(duì)數(shù)組賦值的三種形式

    C語(yǔ)言中對(duì)數(shù)組賦值的三種形式

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中對(duì)數(shù)組賦值的3種形式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論