VC6.0中用openCV函数对图像的操作求大神回答!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC6.0中用openCV函数对图像的操作求大神回答!相关的知识,希望对你有一定的参考价值。

本人需要用VC6.0的openCV函数对图像进行抠图操作,具体是这样的,给了一个源图像,给定一个区域的位置坐标和区域大小,然后要求把这一块区域图像抠下来,保存成另一张图像。
能不能跟我说一下具体的方法,思路是什么?用哪些openCV函数?每个函数作用是什么?
(ps:一定要是opencv函数哦!)

int main()

IplImage* src = cvLoadImage("image.jpg");

CvRect roi; // 给定的区域的位置坐标和区域大小
roi.x = 0; roi.y = 0; // roi的x,y,是给定的区域的左上角坐标
roi.width = 20; //width, height 是给定的区域的宽、高
roi.height = 20;

IplImage* dst = cvCreateImage(cvSize(roi.width,roi.height),src->depth,src->nChannals);

cvSetImageROI(src, roi); // 在原图上标定感兴趣的区域
cvCopy(src,dst);//将原图上感兴趣的区域copy到dst图像上
cvResetImageROI(src); //释放标定的原图的感兴趣区域

cvNamedWindow("src"); // 显示图像

cvShowImage("src",src);
cvNamedWindow("dst");
cvShowImage("dst",dst);

cvWaitKey(0);

cvDestroyAllWindows();
cvReleaseImage(&src); //释放图像
cvReleaseImage(&dst);

return 0;

追问

谢谢

参考技术A 这个其实很简单,用一个cvcopy函数就行,你敢信?O(∩_∩)O哈哈~。但是这里要设置好对应的mask.
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
src
输入数组。
dst
输出数组。
mask
操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。
刚才说了这个mask很重要,因为你知道坐标,如果是矩形区域那最好,更容易。如果是不规则的,也可以,只要你设置好mask这个矩阵就行。希望对你有帮助哦,有时候看起来麻烦的在opencv里面是不难的。
参考技术B 额。。很简单的。用opencv里面的ROI就可以鸟,你自己去学习一下ROI,然后保存下就ok

Android中用opencv处理图片

一、opencv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
opencv官方下载请添加链接描述
我下载的是opencv-4.4.0-android-sdk

二、加载编译
先创建个Android工程,然后File-New-Import Module,导入我们下载好的sdk中的.sdkjava路径,然后将.sdk ativelibs下的动态库so包引入到lib下。
此时编译老是报错,缺少一个libc++_shared.so的包,网上找到并引入,编译成功。
工程目录如下,opencv即导入的module,jniLibs是引入的动态库包路径。
技术图片
其中配置文件build.grdle(:app)中
defaultConfig中加入配置如下,主要是为了解决上面说的编译时缺少libc++_shared.so包的问题。网上找到的解释是,因为版本差异,libopencv_java4中没有这个so包,所以要编译时假装编译出了我们放在libb目录下的libc++_shared.so。

ndk{
    abiFilters "armeabi ","armeabi-v7a"
}

调用的主activity中加载opencv

@Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }

    //openCV4Android 需要加载用到
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS: {
                    Log.i(TAG, "OpenCV loaded successfully"); mOpenCvCameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
                }
                break;
                default: {
                    super.onManagerConnected(status);
                }
                break;
            }
        }
    };

三、图片缩放

                    final String oldPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test.jpg";
                    final String newPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test_new.jpg";
                    double scale = 0.1; // 缩放比例

                    long start = new Date().getTime();
                    Mat img = Imgcodecs.imread(oldPath);// 读入图片,将其转换为Mat
                    Size dsize = new Size(img.width() * scale, img.height() * scale); // 设置新图片的大小
                    Mat img2 = new Mat(dsize, CvType.CV_16S);// 创建一个新的Mat(opencv的矩阵数据类型)
                    Imgproc.resize(img, img2,dsize);//调用Imgproc的Resize方法,进行图片缩放

                    if(Imgcodecs.imwrite(newPath, img2)){//将图形保存到new.jpg中
                        File f = new File(newPath);
                        if(f.exists())
                        {
                            bm=BitmapFactory.decodeFile(newPath);
                            imgview.setImageBitmap(bm);

                            long end = new Date().getTime();
                            Log.d(TAG, "start:"+start+"===end:"+end + "=====" + (end-start));
                            Toast.makeText(ButtonSizeImage.this, "start:"+start+"===end:"+end + "=====" + (end-start), 3).show();
                        }
                    }
                    else{
                        Toast.makeText(ButtonSizeImage.this, "===========图片缩小失败============!!", 3).show();
                    }

四、图片转格式

final String webpPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test.webp";
final String newWebpPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test_2.jpg";
long start = new Date().getTime();
Mat img = Imgcodecs.imread(webpPath);// 读入图片,将其转换为Mat
Imgcodecs.imwrite(newWebpPath, img);
Log.d(TAG, "start:"+start+"===end:"+end + "=====" + (end-start));
Toast.makeText(ButtonSizeImage.this, "start:"+start+"===end:"+end + "=====" + (end-start), 4).show();

以上是关于VC6.0中用openCV函数对图像的操作求大神回答!的主要内容,如果未能解决你的问题,请参考以下文章

VC6.0或VS2010对图片操作

VC6.0里面运用openCV将灰度图像转换成矩阵,报错。需要如何解决。设置堆栈? 程序如下:

openCV在VC6.0中的配置问题

opencv 图像拉伸怎么做????

opencv调用摄像头函数

opencv中如何让白色的区域变成透明背景,然后和别的图片融合???