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
原创粉丝点击