opencv鼠标画矩形截取保存图片一部分并归一化为原图大小(Patches selected for feature extraction)
来源:互联网 发布:关于投资知乎 编辑:程序博客网 时间:2024/05/21 06:44
实验室师兄最近在看Deep Learning Face Representation by Joint Identification-Verification这篇论文,应其要求做第2部分Figure 2: Patches selected for feature extraction的人脸图片切割,如下图:
为了方便我参考了http://blog.csdn.net/Augusdi/article/details/11219083这篇博客。
因部分图片要进行水平翻转和灰度变换,故在原代码基础上做了一些修改,在鼠标绘制矩形后按w,a,s,d可相应整体移动矩形框,按小键盘上1,2,3,5可相应移动矩形某条边实现截取区域的放大和缩小,按enter可保存,保存后若要水平翻转截取的图片可按f,若要将彩色图变为灰度图可按g。
最终实现代码如下:
#include <cv.h>#include <highgui.h>#include <cvaux.h>#include<iostream> #pragma comment(lib, "cv.lib")#pragma comment(lib, "cxcore.lib")#pragma comment(lib, "highgui.lib")CvPoint pt1 = cvPoint(0, 0);CvPoint pt2 = cvPoint(0, 0);bool is_selecting = false;// callback function void cvMouseCallback(int mouseEvent, int x, int y, int flags, void* param){switch (mouseEvent){case CV_EVENT_LBUTTONDOWN:pt1 = cvPoint(x, y);pt2 = cvPoint(x, y);is_selecting = true;break;case CV_EVENT_MOUSEMOVE:if (is_selecting)pt2 = cvPoint(x, y);break;case CV_EVENT_LBUTTONUP:pt2 = cvPoint(x, y);is_selecting = false;break;}return;}int main(int argc, char* argv[]){printf("用鼠标左键在图像窗口中画框,以得到目标区域的大致位置.\ \n然后用a,s,d,w移动所选区域,用1,2,3,5放大或缩小之\ \n由于opencv中键盘响应函数不能响应键盘中的方向键、shift键和ctrl键\ \n所以用tab来切换状态(放大和缩小)\ \n选择结束后用enter键保存\ \n保存后按f可将原图片水平翻转\ \n保存后按g可将原图片转为灰度图\ \n按Esc键退出。");char img_path[80] = "F:\\face_recognition_database\\Images\\010A18.jpg";char save_path[80] = "F:\\face_recognition_database\\Images_cut\\010A18\\25.jpg";char* window = "img";IplImage* img = cvLoadImage(img_path);IplImage* img2 = cvLoadImage(img_path);IplImage* img3 = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);//用原图像指针创建新图像IplImage* img_show = cvCloneImage(img);cvNamedWindow(window, CV_WINDOW_AUTOSIZE);cvSetMouseCallback(window, cvMouseCallback);bool shift_on = false;char text[80];CvFont font;cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0, 1.0);while (true){cvCopy(img, img_show);cvRectangle(img_show, pt1, pt2, cvScalar(255, 255, 255));sprintf(text, "roi = cvRect(%d,%d,%d,%d)", pt1.x, pt1.y, std::abs(pt2.x - pt1.x), std::abs(pt2.y - pt1.y));cvPutText(img_show, text, cvPoint(10, 20), &font, cvScalar(0, 0, 255));cvShowImage(window, img_show);char key = cvWaitKey(10);switch (key){case '\t':shift_on = !shift_on; break;case 'a':pt1.x--; pt2.x--; break;case 's':pt1.y++; pt2.y++; break;case 'd':pt1.x++; pt2.x++; break;case 'w':pt1.y--; pt2.y--; break;case '1':if (shift_on) pt1.x--;else pt2.x--;break;case '2':if (shift_on) pt2.y++;else pt1.y++;break;case '3':if (shift_on) pt2.x++;else pt1.x++;break;case '5':if (shift_on) pt1.y--;else pt2.y--;break;case '\r':cvSetImageROI(img, cvRect(pt1.x, pt1.y, std::abs(pt2.x - pt1.x), std::abs(pt2.y - pt1.y)));cvResize(img, img2,CV_INTER_LINEAR);cvSaveImage(save_path, img2);cvResetImageROI(img);break;case 'f':cvFlip(img2, img2, 1);//flip_mode=0为垂直翻转,>0为水平翻转cvSaveImage(save_path, img2);break;case 'g':cvCvtColor(img2, img3, CV_BGR2GRAY);cvSaveImage(save_path, img3);break;};if (key == 27) break;}cvReleaseImage(&img);cvReleaseImage(&img_show);return 0;}
效果图:
0 0
- opencv鼠标画矩形截取保存图片一部分并归一化为原图大小(Patches selected for feature extraction)
- 【matlab】从图片中截取矩形区域(手工选取/标记在原图上/截取矩形区域并保存)
- opencv截取一部分并保存
- opencv-- 使用鼠标绘制矩形并截取和保存矩形区域图像
- 用鼠标截取矩形图像并保存(1)
- opencv截取图片并保存
- 利用鼠标绘制矩形和截取图像的矩形区域并保存(OpenCV2.4.5)
- 【Matlab图像处理】截取图像中的矩形区域(可不平行于坐标轴)并保存为图片
- opencv--画矩形框与图片截取
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- 2.9 opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- [good]opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- 23设计模式之装饰模式(Decorator)
- ubuntu 网络配置
- 复杂链表的复制
- PHP几个防SQL注入攻击自带函数区别 .
- 【PMP考试资料】重磅利器!高频关键词锁定答案!!
- opencv鼠标画矩形截取保存图片一部分并归一化为原图大小(Patches selected for feature extraction)
- <the hacker guide to python>读书笔记
- 理解RESTful架构
- 关于驱动弹出数字签名不受信任的问题
- Gray码的生成算法(直接由二进制数转格雷码)
- MFC对话框应用程序 如何在对话框窗口显示前获取窗口(控件)的屏幕坐标位置
- OCP-V13-703
- PHP自动判断字符集并转码的方法
- C#执行异步操作的几种方式总结比较