歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenCV中的圖像復制機制

本人OpenCV入門,寫了一個給圖像文件加噪聲的子函數salt.cpp,然後再主函數main中調用,用以顯示原圖像文件和加噪聲文件之間的明顯對比。但是現在出現了一個問題,如果我先調用salt()函數,然後imshow()顯示原圖和加噪之後的圖片,會發現顯示的兩幅圖片均是加噪後的結果,原圖片被修改了。但是我若是先imshow原圖片,然後加噪聲salt(),此時再用imshow()加噪的圖片,才是我想要的結果。其實這對程序本身沒什麼影響,但是我想知道怎樣才能達到如下目的:先調用salt(),然後imshow()原圖片和加噪圖片,使得原始圖像和加噪圖像均能正常地顯示?(原始圖像和加噪圖像能正常的對比顯示?)

--------------------------------------分割線 --------------------------------------

Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm

Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm

CentOS下OpenCV無法讀取視頻文件 http://www.linuxidc.com/Linux/2011-07/39295.htm

Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm

Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm

基於QT和OpenCV的人臉識別系統 http://www.linuxidc.com/Linux/2011-11/47806.htm

--------------------------------------分割線 --------------------------------------

語言敘述不是很清晰:具體代碼請大家過目

先是加噪的子函數salt(),獨立存儲為salt.cpp

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
 void salt(cv::Mat &image,cv::Mat &resultimg,int n){
        resultimg=image;
        for(int k=0;k<n;k++){
                int i=rand()%resultimg.cols;
                int j=rand()%resultimg.rows;
                if(resultimg.channels()==1){//graylevel image
                                        resultimg.at<uchar>(j,i)=255;
                }else if(resultimg.channels()==3){//color image
                        resultimg.at<cv::Vec3b>(j,i)[0]=255;
                        resultimg.at<cv::Vec3b>(j,i)[1]=255;
                        resultimg.at<cv::Vec3b>(j,i)[2]=255;
                }
        }
       
}

然後是調用salt()的主函數,存儲為ex1.cpp

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//隱藏控制台窗口
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
//調用salt.cpp中子函數的方法
void salt(cv::Mat &image,cv::Mat &resultimg,int n);

int main()
{
        const char *pstrImageName = "lena.jpg";
        const char *pstrSaveImageName = "lena_resize.jpg";
        const char *pstrWindowsSrcTitle = "原圖 ";
        const char *pstrWindowsDstTitle = "縮放圖";
        //初始化圖像對象
        cv::Mat image=cv::imread(pstrImageName);
        cv::Mat resultimg ;
       
    cv::namedWindow(pstrWindowsSrcTitle);
    cv::namedWindow(pstrWindowsDstTitle);
   
       

    salt(image,resultimg,3000);
       
        cv::imshow("original",image);
        cv::imshow("salt result",resultimg);
       
        cv::waitKey(0);
        return 1;
}

運行結果

是不是我的子函數設計出現了問題?本人cPP基礎不好 還請這裡的大神多多指教!

後來 經過自己的摸索 發現

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101692p2.htm

Copyright © Linux教程網 All Rights Reserved