㈠ android中如何用opencv處理傾斜校正的問題,求源代碼
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "cvcam.h"
//圖像的像素直接提取
#define _I(img,x,y) ((unsigned char*)((img)->imageData + (img)->widthStep*(y)))[(x)]
//亞像素級灰度值
#define _IF(image,x,y) ( ((int)(x+1)-(x))*((int)(y+1)-(y))*_I((image),(int)(x),(int)(y)) + ((int)(x+1)-(x))*((y)-(int)(y))*_I((image),(int)(x),(int)(y+1)) + ((x)-(int)(x))*((int)(y+1)-(y))*_I((image),(int)(x+1),(int)(y)) + ((x)-(int)(x))*((y)-(int)(y))*_I((image),(int)(x+1),(int)(y+1)) )//插值後的像素值(IN表示interpolation),x、y可以為小數
void callback(IplImage* image);
void main()
{
int ncams = cvcamGetCamerasCount( );//返回可以訪問的攝像頭數目
HWND mywin;
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE);
cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE);
mywin = (HWND)cvGetWindowHandle("cvcam window");
cvcamSetProperty(0, CVCAM_PROP_WINDOW, &mywin);
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback);
//cvcamGetProperty(0, CVCAM_VIDEOFORMAT,NULL);
cvNamedWindow( "徑向矯正1", 1 );//創建窗口
cvNamedWindow( "徑向矯正2", 1 );//創建窗口
cvcamInit( );
cvcamStart( );
cvWaitKey(0);
cvcamStop( );
cvcamExit( );
cvDestroyWindow( "徑向矯正1" );//銷毀窗口
cvDestroyWindow( "徑向矯正2" );//銷毀窗口
}
void callback(IplImage* image)
{
IplImage* Show1 = cvCreateImage( cvSize(320,240), IPL_DEPTH_8U, 1);
IplImage* Show2 = cvCreateImage( cvSize(420,340), IPL_DEPTH_8U, 1);
IplImage* ImageC1 = cvCreateImage( cvSize(320,240), IPL_DEPTH_8U, 1);
//轉換為灰度圖
cvCvtColor( image, ImageC1, CV_RGB2GRAY);
cvFlip( ImageC1, NULL, 0);
double *mi;
double *md;
mi = new double[3*3];
md = new double[4];
CvMat intrinsic_matrix,distortion_coeffs;
//攝像機內參數
cvInitMatHeader(&intrinsic_matrix,3,3,CV_64FC1,mi);
//鏡頭畸變參數
cvInitMatHeader(&distortion_coeffs,1,4,CV_64FC1,md);
/////////////////////////////////////////////////
///輪首掘////////芹租/////////////////320*240 120度臘核廣角鏡頭
//參數由matlab獲得
double fc1,fc2,cc1,cc2,kc1,kc2,kc3,kc4;
fc1 = 667.23923/2.5;
fc2 = 669.78156/2.5;
cc1 = 429.96933/2.5;
cc2 = 351.48350/2.5;
kc1 = -0.40100;
kc2 = 0.19463;
kc3 = 0.00508;
kc4 = -0.00051;
cvmSet(&intrinsic_matrix, 0, 0, fc1);
cvmSet(&intrinsic_matrix, 0, 1, 0);
cvmSet(&intrinsic_matrix, 0, 2, cc1);
cvmSet(&intrinsic_matrix, 1, 0, 0);
cvmSet(&intrinsic_matrix, 1, 1, fc2);
cvmSet(&intrinsic_matrix, 1, 2, cc2);
cvmSet(&intrinsic_matrix, 2, 0, 0);
cvmSet(&intrinsic_matrix, 2, 1, 0);
cvmSet(&intrinsic_matrix, 2, 2, 1);
cvmSet(&distortion_coeffs, 0, 0, kc1);
cvmSet(&distortion_coeffs, 0, 1, kc2);
cvmSet(&distortion_coeffs, 0, 2, kc3);
cvmSet(&distortion_coeffs, 0, 3, kc4);
////////////////////////////320*240 120度廣角鏡頭
/////////////////////////////////////////////////
//矯正畸變(opencv)
cvUndistort2( ImageC1, Show1, &intrinsic_matrix, &distortion_coeffs);
//矯正畸變
for (int nx=0; nx<420; nx++)
{
for (int ny=0; ny<340; ny++)
{
double x=nx-50;
double y=ny-50;
double xx=(x-cc1)/fc1;
double yy=(y-cc2)/fc2;
double r2=pow(xx,2)+pow(yy,2);
double r4=pow(r2,2);
double xxx=xx*(1+kc1*r2+kc2*r4)+2*kc3*xx*yy+kc4*(r2+2*xx*xx);
double yyy=yy*(1+kc1*r2+kc2*r4)+2*kc4*xx*yy+kc3*(r2+2*yy*yy);
double xxxx = xxx*fc1+cc1;
double yyyy = yyy*fc2+cc2;
if (xxxx>0 && xxxx<320 && yyyy>0 && yyyy<240)
{
_I(Show2,nx,ny) = (int)_IF(ImageC1,xxxx,yyyy);
}
else
{
_I(Show2,nx,ny) = 0;
}
}
}
//畫線
cvLine( Show1, cvPoint(0,10), cvPoint(320,10), cvScalar(255,255,255),3 );
cvLine( Show1, cvPoint(0,230), cvPoint(320,230), cvScalar(255,255,255),3 );
cvLine( Show1, cvPoint(10,0), cvPoint(10,240), cvScalar(255,255,255),3 );
cvLine( Show1, cvPoint(310,0), cvPoint(310,240), cvScalar(255,255,255),3 );
cvLine( Show1, cvPoint(0,0), cvPoint(320,240), cvScalar(255,255,255),3 );
cvLine( Show1, cvPoint(0,240), cvPoint(320,0), cvScalar(255,255,255),3 );
cvLine( Show1, cvPoint(0,10), cvPoint(320,10), cvScalar(0,0,0) );
cvLine( Show1, cvPoint(0,230), cvPoint(320,230), cvScalar(0,0,0) );
cvLine( Show1, cvPoint(10,0), cvPoint(10,240), cvScalar(0,0,0) );
cvLine( Show1, cvPoint(310,0), cvPoint(310,240), cvScalar(0,0,0) );
cvLine( Show1, cvPoint(0,0), cvPoint(320,240), cvScalar(0,0,0) );
cvLine( Show1, cvPoint(0,240), cvPoint(320,0), cvScalar(0,0,0) );
//顯示
cvShowImage("徑向矯正1", Show1);
cvShowImage("徑向矯正2", Show2);
cvWaitKey(1);
cvReleaseImage( &Show1 );
cvReleaseImage( &Show2 );
cvReleaseImage( &ImageC1 );
}
來自: http://www.eyesourcecode.com/t/41983/1/1
㈡ android如何獲取相機解析度
安卓系統在獲取相機解析度時,可以參考SDK中的API,獲取相機的參數:
Camera.Parameters parameters = camera.getParameters();
獲取預覽的各種解析度:
List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
獲取攝像頭支持的各種解析度:
List<Size> supportedPictureSizes = parameters.getSupportedPictureSizes();
例如:獲取照相機參數,設置需要的參數,其餘預設
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
設置照片格式:
parameters.setPictureFormat(PixelFormat.JPEG);
設置預瀏尺寸,注意要在攝像頭支持的范圍內選擇:
parameters.setPreviewSize(WIDTH, HEIGHT);
設置照片解析度,注意要在攝像頭支持的范圍內選擇
parameters.setPictureSize(WIDTH, HEIGHT);
設置照相機參數:
camera.setParameters(parameters);
開始拍照:
camera.startPreview();
以上就是獲取相機解析度的步驟。
㈢ 常用的像素操作演算法:Resize、Flip、Rotate
圖像縮放是把原圖像按照目標尺寸放大或者縮小,是圖像處理的一種。
圖像縮放有多種演算法。最為簡單的是最臨近插值演算法,它是根據原圖像和目標圖像的尺寸,計算縮放的比例,然後根據縮放比例計算目標像素所依據的原像素,過程中自然會產生小數,這時就採用四捨五入,取與這個點最相近的點。
除此之外,還有雙線性插值演算法。
其公式如下:
f(i+u,j+v) =(1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中U和V表示浮點坐標的小數部分,顯然離目標點距離越近的點的權重越大,這也正符合目標點的值與離他最近的點最接近這一事實。
cv4j 的resize目前支持這兩種演算法。通過Resize類的源碼,可以看到有兩個常量
使用最臨近插值演算法,將原圖縮小到0.75倍。
使用雙線性插值演算法,將原圖放大2倍。
效果如下:
Flip是翻轉的意思,也被稱為鏡像變換。又可以分為水平鏡像和垂直鏡像,水平鏡像即將圖像左半部分和右半部分以圖像豎直中軸線為中心軸進行兌換,而豎直鏡像則是將圖像上半部分和下半部分以圖像水平中軸線為中心軸進行兌換。
flip的演算法很簡單
實現具體的左右翻轉
實現具體的上下翻轉
效果如下:
圖像旋轉是指圖像以某一點為中心旋轉一定的角度,形成一幅新的圖像的過程。當然這個點通常就是圖像的中心。既然是按照中心旋轉,自然會有這樣一個屬性:旋轉前和旋轉後的點離中心的位置不變。
圖像的旋轉是圖像幾何變換的一種,旋轉前後的圖像的像素的RGB都是沒有改變的,改變的只是每一個像素的所在位置。
cv4j 提供兩種旋轉的演算法:NormRotate和FastRotate
下面以NormRotate為例,使用起來很簡單,旋轉120度,背景為紅色。
效果如下:
cv4j 是 gloomyfish 和我一起開發的圖像處理庫,純java實現,我們已經分離了一個Android版本和一個Java版本。
像素操作是 cv4j 的基本功能之一,本文介紹了三種常見的變換。我們可以通過圖像的Resize、Flip、Rotate變換來豐富圖片數據的多樣性。
如果您想看該系列先前的文章可以訪問下面的文集:
http://www.jianshu.com/nb/10401400
㈣ 用C或C++怎樣提取出bmp圖像的像素點信息值用LSB演算法做信息隱藏,點陣圖是24位的。
CImage m_image;//m_image就是要處理的圖像
int bit=m_Image.GetBPP();//獲取每點像素的位數(8,24,32等),如果只處理24點陣圖,則bit可直接賦值為24
int width=m_Image.GetWidth();//圖像的寬度(單位為像素)
int height=m_Image.GetHeight();//圖像的長度(單位為像素)
HBITMAP bitmap = m_Image.Detach();//
CBitmap *b_Image=CBitmap::FromHandle(bitmap);//獲取CBitmap類的實例
DWORD totalbytes=width*height*bit/8;//要保存像素數據需要的總的位元組數,24點陣圖的話,每個像素需要3個位元組
byte *lpBits=new byte[totalbytes];//位元組型數組,每個單位存一個位元組的數據
int bytes=b_Image->GetBitmapBits(totalbytes,lpBits);//把像素數據存到數組lpBits里,通過看bytes是否為0可以知道是否成功,為0則沒有成功
//接下來遍歷數組即可獲取像素數據,因為24點陣圖是3個位元組構成一個像素,所以遍歷時要注意間隔。
㈤ 怎麼改tslib源碼裡面校準解析度
把apk文件拷到你的sd卡里然後在手機上菜單里點擊,程序安裝器,這個程序咐銷會自動搜索你卡上的絕簡歲apk文件,點擊安裝就可以了或者第二種方法:用文件管理器,找到你卡並睜上的apk文件,點擊運行安裝,