1

私はcairommライブラリにcairo Imageサーフェスを持っています

Cairo::RefPtr cropSurface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, Width,Height);

c ++でOpencv Matに変換するにはどうすればよいですか?

4

2 に答える 2

2

これは、cairo + opencv の使用法の短い例です。役に立つことを願っています。

#include <iostream>
#include <vector>
#include <stdio.h>
#include "opencv2/opencv.hpp"

#include "cairo/cairo-win32.h"
#include "cairo/cairo-pdf.h" 
#include "cairo/cairo-ps.h"
#include "cairo/cairo-svg.h"
using namespace std;
using namespace cv;
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
void MatToCairo(Mat &MC3,cairo_surface_t *surface)
{
        Mat MC4 = Mat(cairo_image_surface_get_width(surface),cairo_image_surface_get_height(surface),CV_8UC4,cairo_image_surface_get_data(surface),cairo_image_surface_get_stride(surface));
        vector<Mat> Imgs1;
        vector<Mat> Imgs2;
        cv::split(MC4,Imgs1);
        cv::split(MC3,Imgs2);
        for(int i=0;i<3;i++)
        {
        Imgs1[i]=Imgs2[i];
        }
        // Alpha - прозрачность
        Imgs1[3]=255; 
        cv::merge(Imgs1,MC4);
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
void CairoToMat(cairo_surface_t *surface,Mat &MC3)
{
        Mat MC4 = Mat(cairo_image_surface_get_width(surface),cairo_image_surface_get_height(surface),CV_8UC4,cairo_image_surface_get_data(surface),cairo_image_surface_get_stride(surface));
        vector<Mat> Imgs1;
        vector<Mat> Imgs2;
        cv::split(MC4,Imgs1);
        cv::split(MC3,Imgs2);
        for(int i=0;i<3;i++)
        {
        Imgs2[i]=Imgs1[i];
        }
        cv::merge(Imgs2,MC3);
}
//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
    int m_spcount;
    double m_compactness(0);
    int width;
    int height;
    Mat Img=imread("D:\\ImagesForTest\\lena.jpg");
    namedWindow("Image");
    width=Img.cols;
    height=Img.rows;

        cairo_surface_t *surface;
        cairo_t *cr;
        surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
        cr = cairo_create(surface);

        MatToCairo(Img,surface);

        cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
        cairo_set_font_size (cr, 32.0);
        cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
        cairo_move_to (cr, 10.0, 50.0);
        cairo_show_text (cr, "Hello, world");

        cairo_surface_write_to_png (surface, "hello.png");

        CairoToMat(surface,Img);

        imshow("Image", Img);

        waitKey(0);
        cairo_destroy (cr);
        cairo_surface_destroy (surface);
        destroyAllWindows();
    return 0;
}
于 2013-11-13T08:31:28.953 に答える