zoukankan      html  css  js  c++  java
  • OpenCV里面的一些常用函数

    找出图片变换后的映射关系

        for (...)
        {
          cv::Point tmppt;
        ...
          ptarr1.push_back(tmppt);
        }for (...)
        {
           cv::Point tmppt;
         ...
    ptarr2.push_back(tmppt); } cv::Mat homo = cv::findHomography(ptarr1, ptarr2, CV_RANSAC);
    ptarr1的点经过homo的映射关系会得到ptarr2的点  homo 就是其中的映射关系

    使用映射关系

        warpPerspective(srcImageMat,imageTransform1,homo,readBackImageMat.size());
    srcImageMat经过homo的映射关系,按照readBackImageMat的尺寸,计算出imageTransform1

    提取图片的某个区域
        cv::Rect roi_rect = cv::Rect(nleft, ntop, width, height);
        Mat roi= imageTransform1(roi_rect);//提出背景区域
        Mat roi2 = readBackImageMat(roi_rect);

    拷贝一个图片到另一个图片的对应区域

    outpt.copyTo(readBackImageMat(roi_rect));
    outpt拷贝到readBackImageMat的roi_rect区域


    松柏克隆
        Mat roi= imageTransform1(roi_rect);//提出背景区域
        Mat roi2 = readBackImageMat(roi_rect);
        
        Mat mask(roi.size(), CV_8UC1,255);
        cv::Size center = mask.size() / 2;
    
        cv::Mat outpt;
        seamlessClone(roi, roi2, mask, center, outpt, NORMAL_CLONE);

    https://blog.csdn.net/hjimce/article/details/45716603

    像素融合
        cv::Mat outpt;
        seamlessClone(roi, roi2, mask, center, outpt, NORMAL_CLONE);
    
        mask.setTo(0);
        mask(cv::Rect(15,30, mask.cols-30,mask.rows-60)).setTo(255);
        cv::blur(mask, mask, cv::Size(15, 30));
    
        cv::Mat rcMat = readBackImageMat(roi_rect);
        for (int i = 0; i < rcMat.rows; i++)
        {
            uchar* cc = rcMat.ptr<uchar>(i);
            uchar* ss = outpt.ptr<uchar>(i);
            uchar* mm = mask.ptr<uchar>(i);
            for (int j = 0; j < rcMat.cols; j++)
            {
                float falpha = mm[j] / 255.0f;
    
                cc[j * 3] = ss[j * 3] * falpha + cc[j * 3] * (1 - falpha);
                cc[j * 3+1] = ss[j * 3+1] * falpha + cc[j * 3+1] * (1 - falpha);
                cc[j * 3+2] = ss[j * 3+2] * falpha + cc[j * 3+2] * (1 - falpha);
            }
        }
    Mat转bitmap
    Bitmap* CPublicFunction::CopyMatToBmp(Mat& i_Mat)
    {
        //assert(mb_InitDone);
    
        PixelFormat e_Format;
        switch (i_Mat.channels())
        {
        case 1: e_Format = PixelFormat8bppIndexed; break;
        case 3: e_Format = PixelFormat24bppRGB;    break;
        case 4: e_Format = PixelFormat32bppARGB;   break;
        default: throw L"Image format not supported.";
        }
    
        // Create Bitmap with own memory
        Bitmap* pi_Bmp = new Bitmap(i_Mat.cols, i_Mat.rows, e_Format);
    
        BitmapData i_Data;
        Gdiplus::Rect k_Rect(0, 0, i_Mat.cols, i_Mat.rows);
        if (Ok != pi_Bmp->LockBits(&k_Rect, ImageLockModeWrite, e_Format, &i_Data))
        {
            delete pi_Bmp;
            throw L"Error locking Bitmap.";
        }
    
        if (i_Mat.elemSize1() == 1) // 1 Byte per channel (8 bit gray scale palette)
        {
            BYTE* u8_Src = i_Mat.data;
            BYTE* u8_Dst = (BYTE*)i_Data.Scan0;
    
            int s32_RowLen = i_Mat.cols * i_Mat.channels(); // != i_Mat.step !!
    
                                                            // The Windows Bitmap format requires all rows to be DWORD aligned (always!)
                                                            // while OpenCV by default stores bitmap data sequentially.
            for (int R = 0; R<i_Mat.rows; R++)
            {
                memcpy(u8_Dst, u8_Src, s32_RowLen);
                u8_Src += i_Mat.step;    // step may be e.g 3729
                u8_Dst += i_Data.Stride; // while Stride is 3732
            }
        }
        else // i_Mat may contain e.g. float data (CV_32F -> 4 Bytes per pixel grayscale)
        {
            int s32_Type;
            switch (i_Mat.channels())
            {
            case 1: s32_Type = CV_8UC1; break;
            case 3: s32_Type = CV_8UC3; break;
            default: throw L"Image format not supported.";
            }
    
            CvMat i_Dst;
            cvInitMatHeader(&i_Dst, i_Mat.rows, i_Mat.cols, s32_Type, i_Data.Scan0, i_Data.Stride);
    
            CvMat i_Img = i_Mat;
            cvConvertImage(&i_Img, &i_Dst, 0);
        }
    
        pi_Bmp->UnlockBits(&i_Data);
    
        // Add the grayscale palette if required.
        if (e_Format == PixelFormat8bppIndexed)
        {
            CByteArray i_Arr;
            i_Arr.SetSize(sizeof(ColorPalette) + 256 * sizeof(ARGB));
            ColorPalette* pk_Palette = (ColorPalette*)i_Arr.GetData();
    
            pk_Palette->Count = 256;
            pk_Palette->Flags = PaletteFlagsGrayScale;
    
            ARGB* pk_Color = &pk_Palette->Entries[0];
            for (int i = 0; i<256; i++)
            {
                pk_Color[i] = Color::MakeARGB(255, i, i, i);
            }
    
            if (Ok != pi_Bmp->SetPalette(pk_Palette))
            {
                delete pi_Bmp;
                throw L"Error setting grayscale palette.";
            }
        }
        return pi_Bmp;
    }

    展示图片的时候控制窗口属性

            cv::namedWindow("head", CV_WINDOW_NORMAL);
            cv::resizeWindow("head", 150, 120);  //控制窗口大小
            cv::moveWindow("head", 1000, 100);//控制窗口起始坐标
            cv::imshow("head", imageROI);

     提取某个矩形区域的图片

    cv::Mat mMat = m_findfacethread->GetImage();
    cv::Mat imageROI = mMat(cv::Rect(x1, y, x2 - x1, y12 - y));




  • 相关阅读:
    探秘小程序(9):父页面与自定义组件交互
    探秘小程序(8):scroll-view组件
    探秘小程序(7):view组件
    探秘小程序(6):微信支付
    探秘小程序(5):用户信息
    通向全栈之路(6)—无密码ssh连接
    探秘小程序(4):授权
    探秘小程序(3):登录
    探秘小程序(2):自定义组件
    [Python]json对象转换出错expected string or buffer python
  • 原文地址:https://www.cnblogs.com/baldermurphy/p/9184476.html
Copyright © 2011-2022 走看看