opencv3 学习笔记 第三章:
2017-03-01 11:02
351 查看
opencv3 安装配置
参考《OpenCV3 编程入门》—毛星云 冷雪飞 等编著本系列学习笔记纯属整理书本内容
#include <opencv2/opencv.hpp> using namespace cv; void main() { printf("\t 当前使用的opencv版本为 OpenCV "CV_VERSION);//显示opencv版本 //读入图像 Mat srcImage=imread("1.jpg"); //Mat srcImage=imread("1.jpg",2|4); 读入无损图像 //Mat srcImage=imread("1.jpg",0); 读入灰度图像 //Mat srcImage=imread("1.jpg",1); 读入彩色图像 //创建窗口 namedWindow("【Window Name】",WINDOW_NORMAL);//默认,用户可改变窗口大小 // namedWindow("【Window Name】",WINDOW_AUTOSIZE); //图片显示 imshow("[原始图]", srcImage); //显示 //创建滑动条 createTrackbar("对比度", "【效果图窗口】", &g_nContrastValue, 300, onChange,[void* userdata=0]); //改变对比度值g_nContrastValue(应为全局变量),最大可为300,回调函数为void onChange(int, void*) //获取当前滑动条的位置 int getTrackbarPos("滑动条名字","窗口名字"); //鼠标操作 setMouseCallback("窗口名字",onMouse,[void* userdata=0]); watiKey(0); }
以下贴上原书代码:
实例一:生成透明png图像
#include <vector> #include <stdio.h> #include<opencv2/opencv.hpp> using namespace cv; using namespace std; // 描述:创建带alpha通道的Mat void createAlphaMat(Mat &mat) { for(int i = 0; i < mat.rows; ++i) { for(int j = 0; j < mat.cols; ++j) { Vec4b&rgba = mat.at<Vec4b>(i, j); rgba[0]= UCHAR_MAX; rgba[1]= saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX); rgba[2]= saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX); rgba[3]= saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2])); } } } int main( ) { //创建带alpha通道的Mat Mat mat(480, 640, CV_8UC4); createAlphaMat(mat); ShowHelpText(); vector<int>compression_params; compression_params.push_back(IMWRITE_PNG_COMPRESSION); compression_params.push_back(9); //显示图片 try{ imwrite("透明Alpha值图.png", mat, compression_params); imshow("生成的png图",mat); fprintf(stdout,"PNG图片文件的alpha数据保存完毕~\n可以在工程目录下查看由imwrite函数生成的图片\n"); waitKey(0); } catch(runtime_error& ex) { fprintf(stderr,"图像转换成PNG格式发生错误:%s\n", ex.what()); return 1; } return 0; }
实例二:创建滑动条
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; #define WINDOW_NAME "【滑动条的创建&线性混合示例】" //为窗口标题定义的宏 // 描述:全局变量声明 const int g_nMaxAlphaValue = 100;//Alpha值的最大值 int g_nAlphaValueSlider;//滑动条对应的变量 double g_dAlphaValue; double g_dBetaValue; //声明存储图像的变量 Mat g_srcImage1; Mat g_srcImage2; Mat g_dstImage; // 描述:响应滑动条的回调函数 void on_Trackbar( int, void* ) { //求出当前alpha值相对于最大值的比例 g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ; //则beta值为1减去alpha值 g_dBetaValue = ( 1.0 - g_dAlphaValue ); //根据alpha和beta值进行线性混合 addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);//addWeighted(图1,系数1,图2,系数2,+常数,存入图片) //显示效果图 imshow( WINDOW_NAME, g_dstImage ); } int main( int argc, char** argv ) { //读入图像 (两图像的尺寸需相同) g_srcImage1 = imread("1.jpg"); g_srcImage2 = imread("2.jpg"); if( !g_srcImage1.data ) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; } if( !g_srcImage2.data ) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; } //设置滑动条初值为70 g_nAlphaValueSlider = 70; //创建窗体 namedWindow(WINDOW_NAME, 1); //在创建的窗体中创建一个滑动条控件 char TrackbarName[50]; sprintf( TrackbarName, "透明值 %d", g_nMaxAlphaValue ); createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar ); //结果在回调函数中显示 on_Trackbar( g_nAlphaValueSlider, 0 ); //按任意键退出 waitKey(0); return 0; }
实例三:鼠标操作
#include <opencv2/opencv.hpp> using namespace cv; // 描述:定义一些辅助宏 #define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏 // 描述:全局函数的声明 void on_MouseHandle(int event, int x, int y, int flags, void* param); void DrawRectangle( cv::Mat& img, cv::Rect box ); // 描述:全局变量的声明 Rect g_rectangle; bool g_bDrawingBox = false;//是否进行绘制 RNG g_rng(12345); // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行 int main( int argc, char** argv ) { //【0】改变console字体颜色 system("color 9F"); //【0】显示欢迎和帮助文字 ShowHelpText(); //【1】准备参数 g_rectangle = Rect(-1,-1,0,0); Mat srcImage(600, 800,CV_8UC3), tempImage; srcImage.copyTo(tempImage); g_rectangle = Rect(-1,-1,0,0); srcImage = Scalar::all(0); //【2】设置鼠标操作回调函数 namedWindow( WINDOW_NAME ); setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage); //【3】程序主循环,当进行绘制的标识符为真时,进行绘制 while(1) { srcImage.copyTo(tempImage);//拷贝源图到临时变量 if( g_bDrawingBox ) DrawRectangle( tempImage, g_rectangle );//当进行绘制的标识符为真,则进行绘制 imshow( WINDOW_NAME, tempImage ); if( waitKey( 10 ) == 27 ) break;//按下ESC键,程序退出 } return 0; } // 描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作 void on_MouseHandle(int event, int x, int y, int flags, void* param) { Mat& image = *(cv::Mat*) param; switch( event) { //鼠标移动消息 case EVENT_MOUSEMOVE: { if( g_bDrawingBox )//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中 { g_rectangle.width = x-g_rectangle.x; g_rectangle.height = y-g_rectangle.y; } } break; //左键按下消息 case EVENT_LBUTTONDOWN: { g_bDrawingBox = true; g_rectangle =Rect( x, y, 0, 0 );//记录起始点 } break; //左键抬起消息 case EVENT_LBUTTONUP: { g_bDrawingBox = false;//置标识符为false //对宽和高小于0的处理 if( g_rectangle.width < 0 ) { g_rectangle.x += g_rectangle.width; g_rectangle.width *= -1; } if( g_rectangle.height < 0 ) { g_rectangle.y += g_rectangle.height; g_rectangle.height *= -1; } //调用函数进行绘制 DrawRectangle( image, g_rectangle ); } break; } } // 描述:自定义的矩形绘制函数 void DrawRectangle( cv::Mat& img, cv::Rect box ) { cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色 }
相关文章推荐
- 《学习opencv》学习笔记 - 第三章 初探opencv
- Pro visual c++/cli and .net 2.0 platform2 学习笔记(8第三章 面向对象的C++/CLI===1)
- Spring学习笔记:第三章 IoC中的国际化
- c++学习笔记-------《c++自学通》第三章 变量与常量
- OpenCV学习笔记(2)隐藏 Console 窗口
- 《COM原理及应用》学习笔记之第三章
- 《HTML & XHTML权威指南》的学习笔记01 -- 第三章.HTML/XHTML文档的元素
- Win32学习笔记 第三章 HelloWin
- OpenCV 学习笔记(1)安装设置、显示图像
- OPENCV学习笔记(1)
- 《COM原理及应用》学习笔记之第三章
- OpenCV学习笔记(一)
- OpenCV中滤波器学习笔记(一)--CvSepFilter
- C++primer 第三章学习笔记(string篇)
- OpenCV学习笔记(4)视频文件的读取与保存(2010-01-23 更新)
- Win32学习笔记 第三章 HelloWin 选择自 villager 的 Blog
- Spring in Action 学习笔记—第三章创建切面
- ASP.net(1.1)原理学习笔记--第三章 配置Configuration
- OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同步工作
- OpenCV 学习笔记