opencv利用矩形框选中某一区域并保存为新图片

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下

一、基本原理

Mat img= imread(image);
Rect rect(50,20, 200, 50);
Mat ROI = img(rect);
imshow("ROI_WIN",ROI);

- 其中:Rect的函数定义为: Rect(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
_Tp _x:表示矩形左上角顶点的x坐标; _Tp _y:表示矩形左上角顶点的y坐标;
_Tp _width:表示矩形框的宽度 ; _Tp _height:表示矩形框的高度

二、具体使用

在一张图片中想手动通过鼠标绘制矩形框的方式来选择多个图片区域并逐一保存,其中主要包括以下几方面的实现:

  • 响应鼠标点击事件,绘制矩形框
  • 将矩形框中图片进行显示和保存,保存的文件名为ROI_i.jpg,其中i表示第i次绘制的矩形框。

具体实现代码如下:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

cv::Mat img;
bool select_flag = false;
cv::Rect m_select;
cv::Point origin;
int ROI_count;

void onMouseRectPicking(int event, int x, int y, int, void*)
{
 if (select_flag)
 {
 m_select.x = MIN(origin.x, x);//不一定要等鼠标弹起才计算矩形框,而应该在鼠标按下开始到弹起这段时间实时计算所选矩形框
 m_select.y = MIN(origin.y, y);
 m_select.width = abs(x - origin.x);//算矩形宽度和高度
 m_select.height = abs(y - origin.y);
 m_select &= cv::Rect(0, 0, img.cols, img.rows);//保证所选矩形框在视频显示区域之内
 }
 if (event == CV_EVENT_LBUTTONDOWN)
 {
 select_flag = true;  //鼠标按下的标志赋真值
 origin = cv::Point(x, y); //保存下来单击捕捉到的点
 m_select = cv::Rect(x, y, 0, 0); //这里一定要初始化,宽和高为(0,0)是因为在opencv中Rect矩形框类内的点是包含左上角那个点的,但是不含右下角那个点
 }
 else if (event == CV_EVENT_LBUTTONUP)
 {
 select_flag = false;
 ROI_count++;
 }
}

int main(int argc, char* argv[] )
{

 img=imread("/home/drew/picture_cut/build/scenary.jpg");
 bool stop = false;

 cv::namedWindow("capframe", CV_WINDOW_AUTOSIZE);
 cv::setMouseCallback("capframe", onMouseRectPicking, 0);

 char pic_name[40];
 ROI_count=0;

 while(!stop)
 {
 img=imread("/home/drew/picture_cut/build/scenary.jpg");
 cv::rectangle(img, m_select, cv::Scalar(255,0,0), 2, 8, 0); // 画矩形框
 cv::imshow("capframe",img);

 if((m_select.x!=0)&&(m_select.y!=0)&&(m_select.width!=0)&&(m_select.height!=0))
 {
  sprintf(pic_name,"ROI_%d.jpg",ROI_count);
  Mat ROI = img(m_select);
  imshow("ROI_WIN",ROI);
  imwrite(pic_name,ROI);
 }

 char key = cv::waitKey(30);
 if(key == 27)
  stop = true;
 }
 waitKey(0);
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python opencv实现图片旋转矩形分割

    有时候需要对有角度的矩形框内图像从原图片中分割出来.这里的程序思想是,先将图片进行矩形角度的旋转,使有角度的矩形处于水平状态后,根据原来坐标分割图片. 参考:python opencv实现旋转矩形框裁减功能 修改原来的程序: 1.旋转函数的输入仅为矩形的四点坐标 2.角度由公式计算出来 3.矩形四点pt1,pt2,pt3,pt4由txt文件读入 4.在旋转程序中还处理了顺时针和逆时针及出现矩形框翻转的问题. 代码: # -*- coding:utf-8 -*- import cv2 from m

  • python opencv实现旋转矩形框裁减功能

    本文实例为大家分享了python opencv实现旋转矩形框裁减的具体代码,供大家参考,具体内容如下 经常遇见旋转矩形框的裁减问题,那么思路是,将矩形框旋转正然后再裁减 # -*- coding:gb2312 -*- import cv2 from math import * import numpy as np import time def rotateImage(img,degree,pt1,pt2,pt3,pt4): height,width=img.shape[:2] heightNe

  • opencv提取外部轮廓并在外部加矩形框

    这段时间一直在用opencv搞图像处理的问题,发现虽然可调用的函数多,但是直接找相应代码还是很困难,就行寻找连通域,并在连通域外侧加框,对于习惯使用Mat矩形操作的我,真心感觉代码少之又少,为防止以后自己还会用到,特在此记录一下. 要对下面的图像进行字符的边缘检测. 程序中具体的步骤为: (1)灰度化.二值化 (2)图像膨胀 (3)检测膨胀图像的边缘并叫外矩形框 实现代码如下: #include "stdafx.h" #include "stdio.h" #incl

  • OpenCV选择图像中矩形区域并保存

    本文实例为大家分享了OpenCV选择图像中矩形区域并保存的具体代码,供大家参考,具体内容如下 根据<Learning OpenCV>中的example4.1改写: // An example program in which the // user can draw boxes on the screen. // //#include <cv.h> //#include <highgui.h> #include "opencv2/imgproc/imgproc

  • opencv利用矩形框选中某一区域并保存为新图片

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 一.基本原理 Mat img= imread(image): Rect rect(50,20, 200, 50); Mat ROI = img(rect); imshow("ROI_WIN",ROI); - 其中:Rect的函数定义为: Rect(_Tp _x, _Tp _y, _Tp _width, _Tp _height); _Tp _x:表示矩形左上角顶点的x坐标: _Tp _y:表示矩形左上角

  • OpenCV 轮廓周围绘制矩形框和圆形框的方法

    轮廓周围绘制介绍 没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像: 相关API 减少多边形轮廓点数:approxPolyDP 函数作用:基于RDP算法实现,目的是减少多边形轮廓点数 函数原型: //减少多边形轮廓点数 approxPolyDP( InputArray curve, // 一般是由图像的轮廓点组成的点集 Mat(vector) OutputArray approxCurve, // 表示输出的多边形点集 double epsilon, //

  • OpenCV实现鼠标框选并显示框选区域

    本文实例为大家分享了OpenCV实现鼠标框选并显示框选区域的具体代码,供大家参考,具体内容如下 cvSetImageROI函数(基于给定的矩形设置图像的ROI(感兴趣区域,region of interesting)) void cvSetImageROI(IplImage* image,CvRect rect) 参数: image 图像头,待处理图像 rect ROI 感兴趣区域矩形 cvResetImageROI函数(释放基于给定的矩形设置图像的ROI(感兴趣区域,region of int

  • python opencv 画外接矩形框的完整代码

    画外接矩形框,可以画成一个最大的,也可以分别画. # -*- coding: utf-8 -*- import cv2 image = cv2.imread('G:/110w2/mask_tif4/00.png') print(image.shape) print(image.shape[0]) # h print(image.shape[1]) # w # 图像转灰度图 img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #cv2.imwrite('G:

  • python opencv鼠标画矩形框之cv2.rectangle()函数

    目录 cv2.rectangle()函数说明 参数说明 利用鼠标回调函数交互式画矩形框 总结 关于鼠标回调函数的说明可以参考:opencv-python的鼠标交互操作 cv2.rectangle()函数说明 参数说明 导入cv2后,通过help(cv2.rectangle)可以看到函数的帮助文档如下: rectangle(...) rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img . @brief D

  • OpenCV利用手势识别实现虚拟拖放效果

    目录 第一步 第二步 第三步 完整代码 本文将实现一些通过手拖放一些框,我们可以使用这个技术实现一些游戏,控制机械臂等很多有趣的事情. 第一步 通过opencv设置显示框和调用摄像头显示当前画面 import cv2 cap = cv2.VideoCapture(0) cap.set(3,1280) cap.set(4,720) while True:     succes, img = cap.read()     cv2.imshow("Image", img)     cv2.w

  • C++ opencv利用grabCut算法实现抠图示例

    目录 前言 一.grabCut函数 二.compare函数 三.代码 前言 grabCut算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只用少量的用户交互操作,即可得到比较好的分割结果,和分水岭顺丰比较相似,但是计算速度比较慢,得到的结果比较精确 用法:输入一幅图片并对一些像素做属于背景或属于前景的标记,算法会根据这个局部标记计算出整个图像中前景和背景的分割线. 一.grabCut函数 void grabCut(InputArray img, InputOutputArray mask,

随机推荐