OpenCV裁剪图片并保存

http://blog.csdn.net/chenli2010/article/details/7899773

#include <cv.h>
#include <highgui.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键保存。Esc键退出。");

	char img_path[80] = ".\\test.png";  
	char save_path[80] = ".\\save.jpg";  
	char* window = "img";  

	IplImage* img = cvLoadImage(img_path);    
	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)));  
			cvSaveImage(save_path, img);  
			cvResetImageROI(img);  
			break;  
		};  

		if(key==27) break;  
	}  

	cvReleaseImage(&img);  
	cvReleaseImage(&img_show);  
	return 0;  
}  


  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用OpenCV裁剪图片,你可以使用以下代码示例中的任一方法: 1. ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 读取图片 Mat img = imread("test.jpg"); // 裁剪图片 Mat cropped_image = img(Range(400,1200), Range(350,700)); // 显示原始图片裁剪后的图片 imshow("原始图片", img); imshow("裁剪后的图片", cropped_image); // 保存裁剪后的图片 imwrite("裁剪后的图片.jpg", cropped_image); // 等待按键退出 waitKey(0); // 销毁窗口 destroyAllWindows(); return 0; } ``` 2. ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 读取图片 cv::Mat img; cv::Rect m_select; img = imread("F://Visual Studio 2015//ROItest01//ROItest01//01.jpg"); // 显示原始图片 imshow("原图", img); // 裁剪图片 m_select = Rect(0,0,111,217); Mat ROI = img(m_select); // 显示裁剪后的图片 #### 引用[.reference_title] - *1* [opencv图像裁剪(C++)](https://blog.csdn.net/weixin_44487231/article/details/112849701)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)](https://blog.csdn.net/weixin_42010722/article/details/128183509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值