我试图通过将图像的高度和宽度减半并将其裁剪来使原始图像减半。 [裁剪图像] [1]
以下是我的代码,但它导致运行时异常,.exe文件停止使用以下错误:
OpenCV Error: Assertion failed (rect.width >= 0 && rect.height >= 0 && rect.x < image->width && rect.y < image->height && rect.x + rect.width >= (int)(rect.width > 0) && rect.y + rect.height >= (int)(rect.height > 0)) in cvSetImageROI, file C:\Development\opencv\sources\modules\core\src\array.cpp, line 3006
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
下面是代码:
#include <iostream>
#include <string>
#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
IplImage *img1 = cvLoadImage("image/testcase.jpg");
cvNamedWindow("Image1:",1);
cvShowImage("Image1:",img1);
cout << "Width:" << img1->width <<" pixels"<< endl;
cout << "Height:" << img1->height <<" pixels"<< endl;
int width = img1->width ;
int lenght = img1->height;
// cropping the image
Rect roi;
roi.x = width;
roi.y = lenght;
roi.width = (roi.x)/2;
roi.height = (roi.y)/2;
Mat image_test;
image_test = imread("image/testcase");
// Must have dimensions of output image
IplImage* cropped = cvCreateImage(cvSize(roi.width,roi.height), img1->depth, img1->nChannels );
cvSetImageROI(img1, roi);
cvCopy(img1, cropped);
cvResetImageROI(img1);
cvNamedWindow( "Cropped Image", 1 );
cvShowImage( "Cropped Image", cropped );
cvSaveImage ("savedImage/cropped.jpg" , cropped);
waitKey(0);
return 0;
}
答案 0 :(得分:2)
问题出在roi
。自x=width
和y=length
起,您就会使用图片中的roi。 x
和y
应该是您的roi的左上角。在这种情况下,它们都应该是0
。
你不应该使用过时的 C api。
获取图像左上角的裁剪,您可以简单地说:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
// Load image
Mat3b img = imread("path_to_image");
// Define the roi
Rect roi(0, 0, img.cols / 2, img.rows / 2);
// Crop
Mat3b crop = img(roi);
// Show result
imshow("Original", img);
imshow("Crop", crop);
waitKey();
return 0;
}
产:
答案 1 :(得分:0)
除了使用过时的API(正如@Miki所指出的),OpenCV告诉你问题是什么(为清晰起见而格式化):
OpenCV Error: Assertion failed
(rect.width >= 0
&& rect.height >= 0
&& rect.x < image->width
&& rect.y < image->height
&& rect.x + rect.width >= (int)(rect.width > 0)
&& rect.y + rect.height >= (int)(rect.height > 0))
in cvSetImageROI, file C:\Development\opencv\sources\modules\core\src\array.cpp, line 3006
具体来说,这次对cvSetImageROI()
的调用失败了:
cvSetImageROI(img1, roi);
通过调试器检查每个断言子条件,可以具体确定哪些断言子条件失败。您还可以打印出值并进行比较。分别用img1
代替image
和roi
代替rect
,即:
cout << roi.width << endl; // should be >= 0
cout << roi.height << endl; // should be >= 0
// etc