opencv3 学习笔记 第三章:
来源:互联网 发布:分支界限算法 编辑:程序博客网 时间:2024/06/05 16:53
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通道的Matvoid 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)));//随机颜色}
0 0
- opencv3 学习笔记 第三章:
- opencv3 cookbook 学习笔记
- 第三章学习笔记
- 学习笔记 第三章
- OpenCV3 Mac版学习笔记
- OpenCV3编程入门学习笔记
- 第一篇Opencv3学习笔记:VS2015+Opencv3.2环境配置
- Asp学习笔记第三章
- APUE 学习笔记(第三章)
- SICP第三章学习笔记
- JavaScript学习笔记-第三章
- 汇编学习笔记 第三章
- Win32API学习笔记第三章
- 汇编学习笔记 第三章
- APUE第三章学习笔记
- python学习笔记 第三章
- opencv3.0学习笔记【10/8】
- opencv3.1学习笔记(1)-模块介绍
- Leetcode数据结构
- android 防360圆形进度条
- iOS的App实现状态恢复
- 单向链表的倒数K个节点
- C语言学习总结
- opencv3 学习笔记 第三章:
- 代码review注意事项
- SQLite 安装
- J2SE习题—java基础
- Jedis分片连接池(分布式)
- Jquery 延时加载图片
- 动态当前时间
- webgate 重构 工作进度计划
- (java)leetcode-1