C++OpenCV实现像素画的示例代码
短信预约 -IT技能 免费直播动态提醒
最近在学习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像素画内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341