日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > OpenCV 學習 (Split 和 Merge)

OpenCV 學習 (Split 和 Merge)

來源:程序員人生   發布時間:2016-03-02 11:40:32 閱讀次數:3034次

OpenCV 學習 (Split 和 Merge)

我們在圖象處理時,常常要單獨對某1個色彩通道進行處理。這時候可以利用 Opencv 提供的 split 和 merge 函數。

split 函數

用于將1幅多通道的圖象的各個通道分離。
這個函數的原型以下:


void split(const Mat& src, vector& mv)


用法很簡單,src 是1幅多通道的圖象。
mv 保存各個通道,每一個通道寄存到1個 mat 中。

merge 函數

merge 與split 函數相反。可以將多個單通道圖象合成1幅多通道圖象。
函數原型以下:


void merge(const Mat* mv, size_t count, OutputArray dst);
void merge(const vector& mv, OutputArray dst );


這兩個函數非常簡單,所以就不舉例子了。

有時,我用Qt寫的小程序中也需要這個功能,又不想為了這么點小功能就使用 opencv。所以就自己山寨了兩個函數。(實際上是這篇博客實在是太短了,要找些內容來湊數)
兩個函數的函數聲明以下:


QListsplit(const QImage &image);
QImage merge(const QImage &channel_R, const QImage &channel_G, const QImage &channel_B);


這里 merge 函數只能合并 3 個色彩通道。如果需要 alpha 通道,可以在這個代碼基礎上修改。

下面是代碼,不多解釋。希望對大家有用。


#include#includeinline static bool isContinuous(const QImage &image)
{
    bool ret = false;
    switch(image.format())
    {
    case QImage::Format_Indexed8:
        ret = image.bytesPerLine() == image.width();
        break;
    case QImage::Format_ARGB32:
    case QImage::Format_RGB32:
    case QImage::Format_ARGB32_Premultiplied:
    case QImage::Format_RGBX8888:
    case QImage::Format_RGBA8888:
    case QImage::Format_RGBA8888_Premultiplied:
    case QImage::Format_BGR30:
    case QImage::Format_A2BGR30_Premultiplied:
    case QImage::Format_RGB30:
    case QImage::Format_A2RGB30_Premultiplied:
        ret = image.bytesPerLine() == 4 * image.width();
        break;
    case QImage::Format_RGB16:
    case QImage::Format_RGB555:
    case QImage::Format_RGB444:
    case QImage::Format_ARGB4444_Premultiplied:
        ret = image.bytesPerLine() == 2 * image.width();
        break;
    case QImage::Format_ARGB6666_Premultiplied:
    case QImage::Format_ARGB8565_Premultiplied:
    case QImage::Format_RGB666:
    case QImage::Format_ARGB8555_Premultiplied:
    case QImage::Format_RGB888:
        ret = image.bytesPerLine() == 3 * image.width();
    case QImage::Format_Mono:
    case QImage::Format_MonoLSB:
        ret = image.byteCount()* 8 == image.width() * image.height();
    default:
        ret = false;
        break;
    }
    return ret;
}

QImage merge(const QImage &channel_R, const QImage &channel_G, const QImage &channel_B)
{
    if(channel_R.size() != channel_G.size() || channel_R.size() != channel_B.size())
    {
        return QImage();
    }
    if(channel_R.format() != QImage::Format_Indexed8 ||
            channel_G.format() != QImage::Format_Indexed8 ||
            channel_B.format() != QImage::Format_Indexed8)
    {
        return QImage();
    }
    QImage image(channel_R.size(), QImage::Format_RGB32);
    int width = image.width();
    int height = image.height();
    if(isContinuous(image) && isContinuous(channel_B) && isContinuous(channel_G) && isContinuous(channel_R))
    {
        // 如果圖象占用的內存是連續的,則可以只用1個循環來處理
        width = width * height;
        height = 1;
    }
    for(int j = 0; j < height; j++) { QRgb* line = (QRgb*) image.scanLine(j); const uchar * r = channel_R.constScanLine(j); const uchar * g = channel_G.constScanLine(j); const uchar * b = channel_B.constScanLine(j); for(int i = 0; i < width; i++) { line[i] = qRgb(r[i], g[i], b[i]); } } return image; } QListsplit(const QImage &image) { QListrgb; if(image.isNull()) { return rgb; } QImage::Format f = image.format(); if(f == QImage::Format_RGB32 || f == QImage::Format_ARGB32 || f == QImage::Format_ARGB32_Premultiplied) { rgb.append(QImage()); rgb.append(QImage()); rgb.append(QImage()); rgb[0] = QImage(image.size(), QImage::Format_Indexed8); rgb[1] = QImage(image.size(), QImage::Format_Indexed8); rgb[2] = QImage(image.size(), QImage::Format_Indexed8); for(int i = 0; i < 256; i++) { rgb[0].setColor(i, qRgb(i, 0, 0)); rgb[1].setColor(i, qRgb(0, i, 0)); rgb[2].setColor(i, qRgb(0, 0, i)); } int width = image.width(); int height = image.height(); for(int j = 0; j < height; j++) { const QRgb* line = (QRgb*) image.constScanLine(j); uchar * line_r = rgb[0].scanLine(j); uchar * line_g = rgb[1].scanLine(j); uchar * line_b = rgb[2].scanLine(j); for(int i = 0; i < width; i++) { line_r[i] = qRed(line[i]); line_g[i] = qGreen(line[i]); line_b[i] = qBlue(line[i]); } } } return rgb; }


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成人午夜免费毛片 | 视频福利一区二区 | 国产精品毛片无码 | 亚洲精品乱码久久久久久动图 | 91免费福利 | 成人亚洲免费视频 | 国产香蕉精品视频 | av一区二区三区 | 懂色av蜜臀av粉嫩av | 国产一区福利 | a在线一区| 亚洲美女视频一区 | 精品成人一区二区三区 | 欧美日韩亚| 中文字幕+乱码+中文字 | 久久精品国产一区二区 | 精品久久久久久久人人人人传媒 | 91精品国产亚洲 | 激情婷婷| 精品久久久久一区 | 91久久久久久久久久久久久 | 欧美亚洲免费 | аⅴ资源新版在线天堂 | 麻豆视频国产 | av午夜 | 国产精品一二三四区 | 激情av| 久久亚洲一区二区 | 日韩精品免费在线观看 | 91在线| 日韩欧美精品一区二区 | 国产91av在线 | 污视频网站入口 | 久一国产 | 高清久久| 99国产精品99 | 天堂a在线 | 精品国产欧美 | 免费高清不卡av | 久久精品久久久精品美女 | 久久久久高清 |