opencv imshow函数显示图像时设置中文标题 opencv的imshow函数_边缘检测


前面使用OpenCV创建了一个简单的视频播放器。下面做点更有趣的事情。 许多基本的视觉任务涉及将滤镜应用于视频。下面修改程序,在播放视频时,对其进行简单的操作。

一个简单的操作是平滑图像,通过高斯或其他类似的核函数进行卷积来有效地减少图像的信息。

例5。 在图像显示在屏幕上之前加上高斯平滑操作


#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main(int argc, char** argv)
{
 namedWindow("例5——平滑前", 0);
 namedWindow("例5——平滑后", 0);
 VideoCapture cap;
 cap.open("E:/ 1.mp4");
 Mat frame;
 for (;;)
 {
 cap >> frame;
 if (frame.empty()) break;
 Mat smoothImage;
 GaussianBlur(frame, smoothImage, cv::Size(9, 9), 3, 3);
 imshow("例5——平滑前", frame);
 imshow("例5——平滑后", smoothImage);
 if (waitKey(33) >= 0)
 break;
 }
 return 0;
}


与前面的例子没有什么不同,只是在显示前加了一个高斯模糊。首先声明一个Mat变量smoothImage, GaussianBlur()时使用它得到模糊的结果。输入图像被9×9高斯卷积滤波。高斯内核的大小应始终为奇数,因为高斯内核是以该区域的中心像素计算的。

接下来,再演示一下另一个函数下采样函数怎么用。如果多次对图像进行下采样,会形成一个计算机视觉中常用的尺度空间(也称为图像金字塔),以观察场景或物体的不同尺度下得到变化。

对图像进行下采样相当于一系列卷积。这种采样将高频信号引入到所产生的信号(图像)中。 为了避免这种情况,首先对图像进行高通滤波以限制它的频率,使它们都低于采样频率。 在OpenCV中,下采样由pyrDown()函数完成,例6中演示了这个函数的使用。

例6。 使用pyrDown()创建一个新图像,该图像是输入图像宽度和高度的一半


#include <opencv2/opencv.hpp>
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main(int argc, char** argv)
{
 Mat img1, img2;
 namedWindow("例6_1", 0);
 namedWindow("例6_2", 0);
 img1 = imread("E:/1.jpg",-1);
 imshow("例6_1", img1);
 pyrDown(img1, img2); 
 imshow("例6_2", img2);
 int img1_width, img1_height, img2_width, img2_height;
 img1_width = img1.cols;
 img1_height = img1.rows;
 img2_width = img2.cols;
 img2_height = img2.rows;
 cout << "img1尺寸-------width=" << img1_width << "------height=" << img1_height << endl;
 cout << "img2尺寸-------width=" << img2_width << "------height=" << img2_height << endl;
 cv::waitKey(0);
 return 0;
}


opencv imshow函数显示图像时设置中文标题 opencv的imshow函数_#include_02


这个图将控制台输出结果和图像显示结果同时截图放在一起的,从控制台输出的图像尺寸可以看到,通过下采样,图像大小缩小了,高宽同时缩小了一半。

下面继续演示函数的用法,采用Canny边缘检测Canny()函数对图像进行边缘检测。边缘检测需要单通道图像,因此首先通过cvtColor()函数将图像转换为单通道灰度图像。例7是具体的代码实现。

例7。 Canny边缘检测器将其输出写入单通道(灰度)图像


#include <opencv2/opencv.hpp>
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main(int argc, char** argv)
{
 Mat src, src_gray, cannyImg;
 namedWindow("例7_原图", 0);
 namedWindow("例7_灰度图", 0);
 namedWindow("例7_Canny图", 0);
 src = imread("E:/1.jpg", -1);
 cvtColor(src, src_gray, cv::COLOR_RGB2GRAY);
 Canny(src_gray, cannyImg, 30, 80);
 imshow("例7_原图", src);
 imshow("例7_灰度图", src_gray);
 imshow("例7_Canny图", cannyImg);
 cv::waitKey(0);
 return 0;
}


opencv imshow函数显示图像时设置中文标题 opencv的imshow函数_#include_03


上面涉及到了三个操作函数,大家可以试着将这三个函数连起来对同一个图像进行操作,看下图像处理的效果,在实际使用中,也是这样将各种图像处理函数串起来实现最终的效果。对于canny()函数,也可以试一下不同的输入参数,看得到的结果有什么不同。

下面再做一个有趣的事情,将图像的颜色改变一下,从中可以了解下怎么操作图像中每个像素点的数据。例8展示了像素值的简单方法。这里修改的是三通道图像,如果看过前面介绍的图像处理基础,应该对三通道图像有一定的了解,

例8。 修改图像的像素值


#include <opencv2/opencv.hpp>
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main(int argc, char** argv)
{
 Mat src = imread("E:/1.jpg", 1);
 Mat modifyImg = Mat(src.size(), src.type());//新建一个与src大小、类型相同的空白图像
 namedWindow("例8_原图", 0);
 imshow("例8_原图", src);
 
 int height = src.rows;//图片的高度
 int width = src.cols;//图片的宽度
 
 for (int i = 0; i < height; i++)
 {
 for (int j = 0; j < width; j++)
 {
 modifyImg.at<Vec3b>(i, j)[0] = 255 - src.at<Vec3b>(i, j)[0];
 modifyImg.at<Vec3b>(i, j)[1] = 255 - src.at<Vec3b>(i, j)[1];
 modifyImg.at<Vec3b>(i, j)[2] = 255 - src.at<Vec3b>(i, j)[2];
 }
 }
 namedWindow("例8_修改图", 0);
 imshow("例8_修改图", modifyImg);
 waitKey(0);
 return 0;
}


opencv imshow函数显示图像时设置中文标题 opencv的imshow函数_中imshow函数用法_04