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; }
时间: 2024-04-29 18:19:59 浏览: 10
这段代码是一个不断循环的程序,当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中的,但是这段代码并没有被使用。
相关问题
delphi ocv.core_c, ocv.highgui_c img
在 Delphi XE 中,使用 ocv.core_c 和 ocv.highgui_c 库可以加载、显示和保存图像。以下是一个使用 ocv.core_c 和 ocv.highgui_c 库的示例代码,展示了如何加载、显示和保存图像:
```delphi
uses
ocv.core_c, ocv.highgui_c;
procedure LoadAndShowImage();
var
img: pIplImage;
begin
// 从文件中加载图像
img := cvLoadImage('image.jpg', CV_LOAD_IMAGE_COLOR);
if img = nil then
begin
ShowMessage('Failed to load image!');
Exit;
end;
// 创建一个名为 'Input Image' 的窗口,并在其中显示图像
cvNamedWindow('Input Image', CV_WINDOW_AUTOSIZE);
cvShowImage('Input Image', img);
// 等待用户按下任意键
cvWaitKey(0);
// 保存图像到文件
cvSaveImage('output.jpg', img);
// 释放图像和窗口
cvReleaseImage(img);
cvDestroyAllWindows();
end;
```
这个示例代码加载一张名为 'image.jpg' 的图像,并在名为 'Input Image' 的窗口中显示它。然后,它等待用户按下任意键,将图像保存到名为 'output.jpg' 的文件中,并释放图像和窗口。注意,使用 ocv.core_c 和 ocv.highgui_c 库需要注意数据类型的转换和内存管理,建议使用 Delphi XE 提供的 OpenCV 接口进行图像处理。
#include "cv.h" #include "highgui.h" #include "cxcore.h" /*--------------copyright-hanshanbuleng--------------------*/ // 将色调H的取值范围转换到0~180之间 int main() { float H,S,V,H1,S1,V1; IplImage *src = cvLoadImage("F:\\vs2010program\\RGB_HSV\\study_test\\2.jpg", 1); IplImage *hsv_img = cvCreateImage(cvGetSize(src), 8 , 3); IplImage *h_img = cvCreateImage(cvGetSize(src), 8, 1); IplImage *s_img = cvCreateImage(cvGetSize(src), 8, 1); IplImage *v_img = cvCreateImage(cvGetSize(src), 8, 1); cvCvtColor(src, hsv_img, CV_BGR2HSV); cvSplit(hsv_img, h_img, s_img, v_img, NULL); for(int y = 0; y < hsv_img->height; y++){ for(int x = 0; x < hsv_img->width; x++) { H1 = cvGetReal2D(h_img, y, x); S1 = cvGetReal2D(s_img, y, x); V1 = cvGetReal2D(v_img, y, x); //地址法 H = (uchar)h_img->imageData[y*h_img->widthStep + x*h_img->nChannels]; S = (uchar)s_img->imageData[y*s_img->widthStep + x*s_img->nChannels]; V = (uchar)v_img->imageData[y*v_img->widthStep + x*v_img->nChannels]; printf("H:%f S:%f V:%f \n",H,S,V); } } cvNamedWindow("hsv_img", 0); //HSV图 cvShowImage("hsv_img", hsv_img); cvNamedWindow("h_img", 0); //H通道 cvShowImage("h_img", h_img); cvNamedWindow("s_img", 0); //S通道 cvShowImage("s_img", s_img); cvNamedWindow("v_img", 0); //V通道 cvShowImage("v_img", v_img); cvWaitKey(0); cvReleaseImage(&hsv_img); cvReleaseImage(&h_img); cvReleaseImage(&s_img); cvReleaseImage(&v_img); cvDestroyWindow("hsv_img"); cvDestroyWindow("h_img"); cvDestroyWindow("s_img"); cvDestroyWindow("v_img"); return 0; }
这段代码是使用OpenCV库进行图像处理的示例代码。它的主要功能是将一张图片从RGB颜色空间转换为HSV颜色空间,并分离出H、S、V通道的图像。
代码首先加载一张图片,然后创建4个IplImage类型的图像变量,分别用于存储HSV图像、H通道图像、S通道图像和V通道图像。
接下来,使用cvCvtColor函数将RGB图像转换为HSV图像。然后,使用cvSplit函数将HSV图像分离为H、S、V三个单通道的图像。
之后,使用两种方式获取每个像素点的H、S、V值。一种方式是使用cvGetReal2D函数,通过指定坐标获取每个通道的值。另一种方式是使用地址法,通过访问图像数据的内存地址来获取值。
最后,代码使用printf函数打印出每个像素点的H、S、V值,并显示分离后的H、S、V通道图像。
需要注意的是,这段代码中使用的OpenCV版本是旧版本,新版本中已经将IplImage类型替换为Mat类型。