嗚嗚喔學習筆記: 12月 2013

搜尋此網誌

2013年12月6日 星期五

OPENCV[放大失真校正][平滑處理+二值化]{cvSmooth()}

圖片放大會失真
最近看到一篇論文說可以用 平滑處理 + 二值化做處理 
所以就來試試看~~

在二值化 跟 平滑處理 參數做調整 依需求結果都會不一樣

程式碼: 


#include <iostream>
#include <stdio.h>
#include <cv.h>
#include <highgui.h>

using namespace cv ;
void BW(IplImage* img , int color)//二值化BW(,二值化參數) RGB<參數 RGB=255255255
{
  int Height=cvGetDimSize(img,0);//讀取矩陣高度
  int Width=cvGetDimSize(img,1);//讀取矩陣寬度

 
  for(int y = 0 ; y < Height ; y++)
      for(int x = 0 ; x < Width ; x++ )
      {
               if( !(cvGet2D(img, y , x ).val[2] < color && 
                     cvGet2D(img, y , x ).val[1] < color && 
                     cvGet2D(img, y , x ).val[0] < color))
                     cvSet2D(img,y,x,CV_RGB(255,255,255));//特別注意 給值是 (y,x)
               else
                     cvSet2D(img,y,x,CV_RGB(0,0,0));//特別注意 給值是 (y,x)

      }

}
int main()
{
           IplImage* img = cvLoadImage("D:/image/car/BO.png",1);//loading
           cvNamedWindow("img01",1);
           cvShowImage("img01", img);

           for(int i = 0; i < 4; i++)//計數
                     cvSmooth(img, img, CV_GAUSSIAN, 3, 0, 0);//平滑處理
          
           BW(img , 100);//二值化
           cvNamedWindow("img02",1);
           cvShowImage("img02", img);
           cvWaitKey(0);



}

結果: 左圖放大圖  右圖校正結果





參考資料:
http://tw.search.yahoo.com/r/_ylt=A2oKmJJHRaJShTQAMVlr1gt.;_ylu=X3oDMTE2MmE3YTc0BHNlYwNzcgRwb3MDNQRjb2xvA3NnMwR2dGlkA1ZJUFRXNDZfNDcx/SIG=146g51jc8/EXP=1386395079/**http%3a//ethesys.lib.mcu.edu.tw/ETD-db/ETD-search/getfile%3fURN=etd-0629105-163518%26filename=etd-0629105-163518.pdf







2013年12月1日 星期日

C++ 多執行序[Thread][錯誤:abort() has been called]

 最近寫了C++ 多執行序程式遇到了些錯誤~~~在此紀錄

錯誤紀錄:















錯誤: abort() has been called 
       又再一次釋放執行序

原因:  thread mThread 宣告在 if(ture) 後 導致再{}結束後 自動釋放 mThread 
        在執行序執行完畢後又會再釋放一次 mThread 導致錯誤

更正方法: 把thread 宣告在 if(){}區域前就能解決了~

更正程式碼為:











完整程式碼:


#include <iostream>
#include <thread>//使用thread 需要的include

using namespace std;

void test_func(int number)
{
    //寫個大迴圈拖延時間
    double dSum = 0;
    for( int i = 0; i < 10000; ++ i )
      for( int j = 0; j < 10000; ++ j )
        dSum += i*j;
    cout << "Thread:01   " << number << endl;
}

int main( int argc, char** argv )
{
  // 宣告thread 新執行序
  thread mThread;
  if(true)
     mThread=thread(test_func,100);//(fun名稱,fun參數)
 
  //輸出main函式 觀看執行序是否運作
  cout << "main02" << endl;

  // 等待 mthread 結束在執行後續程式碼 
  mThread.join();

  cout << "main03" << endl;

  system("pause");

  return 0;

}

執行結果: 依序為 02 01 03 證明新執行序執行較速度較慢 才會造成 02 比 01 先輸出的結果