C++ OpenCV实现像素画的示例代码

 更新时间:2022年01月21日 15:05:35   作者:青空coding  
这篇文章主要介绍了通过OpenCV进行图片像素的变化,从而形成像素画效果的功能。文中的示例代码讲解详细,感兴趣的小伙伴可以动手试一试

最近在学习OpenCV,准备后续更新一波OpenCV相关的内容。代码实现主要是以 C++ 为主, 另外为了辅助学习,还会使用C# 开发一款桌面的软件,用于演示各种功能。

今天我给大家准备了一个类似于打马赛克的功能。通过像素的变化,演示一个像素画的功能。像素画在 NFT 中特别的流行。

准备工作

需要安装好 OpenCV,OpenCV的安装过程在这里不再赘述。另外我们准备了一个图片。

代码实现

首先我们需要在 CmakeLists.txt 文件中, 添加 OpenCV 的依赖

find_package(OpenCV 4 REQUIRED)

include_directories(
        ${OPENCV_INCLUDE_DIRS}
)

target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})

读取文件

std::string path = "/path/to/img/";
cv::Mat img = cv::imread(path +"meinv.jpeg");

获取原图的像素宽高,然后进行像素比缩放。

int height = img.size().height;
int width = img.size().width;

int pixel_size = 10;

int new_width = width / pixel_size;
int new_height = height / pixel_size;

根据设定的像素比, 对原图进行缩小,再放大的两次 resize 操作。这样就完成了像素图的处理。

cv::Mat imgTmp;
cv::resize(img, imgTmp, cv::Size(new_width, new_height), 0, 0, cv::INTER_LINEAR);

cv::resize(imgTmp, imgTmp, cv::Size(width/2, height/2),0, 0, cv::INTER_LINEAR);

那我们来看下处理过之后的图像效果吧

效果看起来还可以,图片颜色单一图片尺寸稍微小一些的效果会好很多。

完整代码

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {

    std::string path = "/Users/wbf/Desktop/";
    cv::Mat img = cv::imread(path +"meinv.jpeg");
    cv::imshow("meinv", img);
    int height = img.size().height;
    int width = img.size().width;

    int pixel_size = 10;

    int new_width = width / pixel_size;
    int new_height = height / pixel_size;

    std::cout << new_height << "," << new_width << std::endl;
    cv::Mat imgTmp;
    cv::resize(img, imgTmp, cv::Size(new_width, new_height), 0, 0, cv::INTER_LINEAR);

    cv::resize(imgTmp, imgTmp, cv::Size(width/2, height/2),0, 0, cv::INTER_LINEAR);

//    std::vector<cv::Mat> v_mat ;
//    v_mat.push_back(img);
//    v_mat.push_back(imgTmp);
    cv::imshow("meinv2" , imgTmp);
    cv::waitKey(0);
}

到此这篇关于C++ OpenCV实现像素画的示例代码的文章就介绍到这了,更多相关C++ OpenCV像素画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++动态规划之最长公子序列实例

    C++动态规划之最长公子序列实例

    这篇文章主要介绍了C++动态规划之最长公子序列,实例分析了C++求最长公子序列的相关技巧,是C++字符串操作的一个典型应用,需要的朋友可以参考下
    2015-04-04
  • 一起来看看C++STL容器之string类

    一起来看看C++STL容器之string类

    这篇文章主要为大家详细介绍了C++STL容器之string类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++20 新特性 协程 Coroutines(2)

    C++20 新特性 协程 Coroutines(2)

    上篇文章简单给大介绍了 C++20 特性 协程 Coroutines co_yield 和 co_return 那么这篇文章继续给大家介绍C++20 的新特性协程 Coroutines co_await,需要的朋友可以参考一下
    2021-10-10
  • 深入浅析C++ traits技术

    深入浅析C++ traits技术

    traits就是提取“被传进的对象”对应的返回类型,让同一个接口实现对应的功能。因为STL的算法和容器是分离的,两者通过迭代器链接,本文通过实例代码给大家介绍C++ traits技术,感兴趣的朋友一起看看吧
    2021-05-05
  • C语言由浅入深讲解线程的定义

    C语言由浅入深讲解线程的定义

    这篇文章主要介绍了C语言中线程的基础知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 一文带你学习一下C++中的构造函数

    一文带你学习一下C++中的构造函数

    构造函数是一种特殊的函数,它用于在创建对象时初始化对象的值。在本文中,我们将学习C++的构造函数以及如何使用它们来创建对象,希望对大家有所帮助
    2023-05-05
  • 详谈浮点精度(float、double)运算不精确的原因

    详谈浮点精度(float、double)运算不精确的原因

    这篇文章主要介绍了详谈浮点精度(float、double)运算不精确的原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 漫画讲解C语言中最近公共祖先的三种类型

    漫画讲解C语言中最近公共祖先的三种类型

    这篇文章主要总结了使用C语言查找最近公共祖先的三种方法类型,用漫画的方式讲解原理定义,看上去更生动形象,帮助你更好的理解透彻,快来跟着本文往下看吧
    2021-11-11
  • Qt6安装教程(使用国内源)

    Qt6安装教程(使用国内源)

    本文主要介绍了Qt6安装教程(使用国内源),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • linux环境下C++实现俄罗斯方块

    linux环境下C++实现俄罗斯方块

    这篇文章主要为大家详细介绍了linux环境下C++实现俄罗斯方块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论