Mat img_show = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, img->nChannels); cvCopy(img, img_show); cvRectangle(img_show, pt1, pt2, cvScalar(0, 255, 0)); cvShowImage("img", img_show); char key = cvWaitKey(10); cvSetImageROI(img_show, cvRect(pt1.x, pt1.y, abs(pt2.x - pt1.x), abs(pt2.y - pt1.y))); imwrite("ROI.jpg", img_show);将这段代码修改正确
时间: 2023-11-20 12:05:24 浏览: 64
这段代码的问题已经被指出,应该将IplImage对象cvCreateImage()和cvCopy()函数替换为Mat对象的构造函数和赋值操作符,并将cvSetImageROI()函数替换为Mat对象的ROI操作。同时,也应该将cvScalar()函数替换为cv::Scalar()。
修改后的代码如下:
```cpp
Mat img_show(img->height, img->width, CV_8UC3);
img->copyTo(img_show);
rectangle(img_show, pt1, pt2, Scalar(0, 255, 0));
imshow("img", img_show);
char key = waitKey(10);
Mat roi(img_show, Rect(pt1.x, pt1.y, abs(pt2.x - pt1.x), abs(pt2.y - pt1.y)));
imwrite("ROI.jpg", roi);
if (key == 27) break;
```
这样就可以正确地创建Mat对象img_show,并在其中绘制矩形框和显示图像。同时,也可以通过ROI操作截取选中的部分,并保存为文件"ROI.jpg"。
相关问题
Mat img_show = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, img->nChannels); cvCopy(img, img_show); cvRectangle(img_show, pt1, pt2, cvScalar(0, 255, 0)); cvShowImage("img", img_show); char key = cvWaitKey(10); cvSetImageROI(img_show, cvRect(pt1.x, pt1.y, abs(pt2.x - pt1.x), abs(pt2.y - pt1.y))); /*IplImage* roi = cvCreateImage(cvSize(abs(pt2.x - pt1.x), abs(pt2.y - pt1.y)), IPL_DEPTH_8U, img->nChannels); cvCopy(img_show, roi); cvResetImageROI(img_show);*/ imwrite("ROI.jpg", img_show);将这段代码修改正确
这段代码的问题已经被指出,应该将IplImage对象cvCreateImage()和cvCopy()函数替换为Mat对象的构造函数和赋值操作符,并将cvSetImageROI()函数替换为Mat对象的ROI操作。同时,也应该将cvScalar()函数替换为cv::Scalar()。
修改后的代码如下:
```cpp
Mat img_show(img->height, img->width, CV_8UC3);
img->copyTo(img_show);
rectangle(img_show, pt1, pt2, Scalar(0, 255, 0));
imshow("img", img_show);
char key = waitKey(10);
Mat roi(img_show, Rect(pt1.x, pt1.y, abs(pt2.x - pt1.x), abs(pt2.y - pt1.y)));
imwrite("ROI.jpg", roi);
if (key == 27) break;
```
这样就可以正确地创建Mat对象img_show,并在其中绘制矩形框和显示图像。同时,也可以通过ROI操作截取选中的部分,并保存为文件"ROI.jpg"。
while (nn == 1) { cvNamedWindow("img", CV_WINDOW_NORMAL); cvSetMouseCallback("img", cvMouseCallback); bool shift_on = false; while (is_selecting) { IplImage* img_show = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, img->nChannels); cvCopy(img, img_show); cvRectangle(img_show, pt1, pt2, Scalar(0, 255, 0)); cvShowImage("img", img_show); char key = cvWaitKey(10); cvSetImageROI(img_show, cvRect(pt1.x, pt1.y, abs(pt2.x - pt1.x), abs(pt2.y - pt1.y))); /*IplImage* roi = cvCreateImage(cvSize(abs(pt2.x - pt1.x), abs(pt2.y - pt1.y)), IPL_DEPTH_8U, img->nChannels); cvCopy(img_show, roi); cvResetImageROI(img_show);*/ cv::imwrite("ROI.jpg", img_show); if (key == 27) break; }
这段代码是一个不断循环的程序,当nn等于1时,进入循环体。循环中创建了一个名为"img"的窗口,并通过cvSetMouseCallback()函数来设置鼠标回调函数cvMouseCallback(),以响应鼠标事件。
接下来,程序进入一个while循环,只要is_selecting为true,就会不断执行循环体。在循环中,程序首先创建一个IplImage对象img_show,将img中的数据复制到img_show中,并在img_show上绘制一个矩形框。
接着,程序调用cvShowImage()函数来显示img_show图像,并等待用户按下键盘。如果按下的键盘键是ESC,则跳出循环;否则,程序会将img_show图像中选中的部分截取出来,并保存为文件"ROI.jpg"。
需要注意的是,程序中注释掉的代码块是用来将选中的部分复制到另一个IplImage对象roi中的,但是这段代码并没有被使用。
阅读全文