C++ openCv 裁剪图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14365411/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
openCv crop image
提问by Johann
I running into problems with my openCv IplImage cropping. Assuming both tmp and img are IplImage* . Using the code:
我的 openCv IplImage 裁剪遇到了问题。假设 tmp 和 img 都是 IplImage* 。使用代码:
printf("Orig dimensions: %dx%d\n", img->width, img->height);
cvSetImageROI(img, cvRect(0, 0,500,500));
tmp = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
cvCopy(img, tmp, NULL);
cvResetImageROI(img);
img = cvCloneImage(tmp);
printf("Orig dimensions after crop: %dx%d\n", tmp->width, tmp->height);
when I use the the cvRect above I'll get an image cropped with a size of 500 x500 as expected, however when i use the rect (400,400,500,500) I'll get an image with the size 500 X 320.
当我使用上面的 cvRect 时,我会得到一个按预期大小裁剪为 500 x500 的图像,但是当我使用 rect (400,400,500,500) 时,我会得到一个大小为 500 X 320 的图像。
回答by Smash
cvRect
is defined as ( int x, int y, int width, int height )
, not (int left, int top, int right, int bottom)
. So you are selecting a 500x500 region starting at the point (x,y) = (400,400)
. I am guessing your image height is 720 ;).
cvRect
被定义为( int x, int y, int width, int height )
,不是(int left, int top, int right, int bottom)
。因此,您正在选择从点开始的 500x500 区域(x,y) = (400,400)
。我猜你的图像高度是 720 ;)。
回答by N.Singh
Image cropping using OpenCV
使用 OpenCV 进行图像裁剪
Mat image=imread("image.png",1);
int startX=200,startY=200,width=100,height=100
Mat ROI(image, Rect(startX,startY,width,height));
Mat croppedImage;
// Copy the data into new matrix
ROI.copyTo(croppedImage);
imwrite("newImage.png",croppedImage);
回答by Vimukthi Gunasekara
Try this.It's work.
试试这个。它的工作。
IplImage *source_image;
IplImage *cropped_Image1;
cout << "Width:" << source_image->width << " pixels" << endl;
cout << "Height:" << source_image->height << " pixels" << endl;
int width = source_image->width;
int lenght = source_image->height;
cv::Rect roi;
roi.x = 1200; //1200 // 950
roi.y = 355; //350 //150
roi.width = 2340; //2360 //2750
roi.height = 1425; //1235 /2500 //2810 //2465 fully braille sheet
cropped_Image1 = cvCreateImage(cvSize(roi.width, roi.height), source_image->depth, source_image->nChannels);
cvSetImageROI(source_image, roi);
cvCopy(source_image, cropped_Image1);
cvResetImageROI(source_image);
cvShowImage("Cropped Image", cropped_Image1);
cvSaveImage("1_cropped.jpg", cropped_Image1);
回答by Md. Hanif Ali Sohag
you can easily crop the image in python by using
您可以使用以下命令轻松裁剪python中的图像
roi = oriImage[refPoint[0][1]:refPoint[1][1], refPoint[0][0]:refPoint[1][0]]
In order to get the two points you can call cv2.setMouseCallback("image", mouse_crop)
.
The function is something like this
为了得到这两个点,你可以调用cv2.setMouseCallback("image", mouse_crop)
。功能是这样的
def mouse_crop(event, x, y, flags, param):
# grab references to the global variables
global x_start, y_start, x_end, y_end, cropping
# if the left mouse button was DOWN, start RECORDING
# (x, y) coordinates and indicate that cropping is being
if event == cv2.EVENT_LBUTTONDOWN:
x_start, y_start, x_end, y_end = x, y, x, y
cropping = True
# Mouse is Moving
elif event == cv2.EVENT_MOUSEMOVE:
if cropping == True:
x_end, y_end = x, y
# if the left mouse button was released
elif event == cv2.EVENT_LBUTTONUP:
# record the ending (x, y) coordinates
x_end, y_end = x, y
cropping = False # cropping is finished
refPoint = [(x_start, y_start), (x_end, y_end)]
if len(refPoint) == 2: #when two points were found
roi = oriImage[refPoint[0][1]:refPoint[1][1], refPoint[0][0]:refPoint[1][0]]
cv2.imshow("Cropped", roi)
cv2.imwrite("crop.jpg",roi)
You can get details from here : Mouse Click and Cropping using Python
您可以从此处获取详细信息:使用 Python 进行鼠标单击和裁剪
For C++ you can do like below:
对于 C++,您可以执行以下操作:
void mouse_call(int event,int x,int y,int,void*)
{
if(event==EVENT_LBUTTONDOWN)
{
leftDown=true;
cor1.x=x;
cor1.y=y;
cout <<"Corner 1: "<<cor1<<endl;
}
if(event==EVENT_LBUTTONUP)
{
if(abs(x-cor1.x)>20&&abs(y-cor1.y)>20) //checking whether the region is too small
{
leftup=true;
cor2.x=x;
cor2.y=y;
cout<<"Corner 2: "<<cor2<<endl;
}
else
{
cout<<"Select a region more than 20 pixels"<<endl;
}
}
if(leftDown==true&&leftup==false) //when the left button is down
{
Point pt;
pt.x=x;
pt.y=y;
Mat temp_img=img.clone();
rectangle(temp_img,cor1,pt,Scalar(0,0,255)); //drawing a rectangle continuously
imshow("Original",temp_img);
}
if(leftDown==true&&leftup==true) //when the selection is done
{
box.width=abs(cor1.x-cor2.x);
box.height=abs(cor1.y-cor2.y);
box.x=min(cor1.x,cor2.x);
box.y=min(cor1.y,cor2.y);
Mat crop(img,box); //Selecting a ROI(region of interest) from the original pic
namedWindow("Cropped Image");
imshow("Cropped Image",crop); //showing the cropped image
leftDown=false;
leftup=false;
}
}
You can get details from here : Mouse Click and Cropping using C++
您可以从此处获取详细信息:使用 C++ 的鼠标单击和裁剪